启动片段:
public void initFrag(){
FragmentTransaction transaction = appContext.getSupportFragmentManager().beginTransaction();
transaction.addToBackStack(null);
transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in,
R.anim.fade_out);
transaction.replace(R.id.root_frame, uiControlTrier, UUID.randomUUID().toString()).commitAllowingStateLoss();
}
这里是createview上的片段。
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.zn_fragment_ui, null);
if (getArguments().getString(STEP_KEY) == null) {
getActivity().finish();
} else {
initView();
}
}
return rootView;
}
根据用户选择,可以多次从活动中调用 initFrag()
。在靠背堆上导致多个片段。
当我按下后退按钮时,应用程序崩溃:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:4424)
at android.view.ViewGroup.addView(ViewGroup.java:4265)
at android.view.ViewGroup.addView(ViewGroup.java:4205)
at android.view.ViewGroup.addView(ViewGroup.java:4178)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1425)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
at android.support.v4.app.BackStackRecord.executePopOps(BackStackRecord.java:855)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2587)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:851)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:794)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:181)
at com.appzonegroup.zonesdk.zone.uiEngine.pageRenderer.UIFlowRenderingBase.onBackPressed(UIFlowRenderingBase.java:152)
at android.app.Activity.onKeyUp(Activity.java:2730)
我已经看过修复此问题的其他主题,但尚无效。
答案 0 :(得分:1)
使用FragmentPagerAdapter
时,同样的问题非常受欢迎。 如果框架要求您创建某些内容,请创建它。不涉及缓存。
此方法要求您创建新视图。
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
首次启动片段时以及配置更改后调用 onCreateView
,例如屏幕旋转。在这种情况下,需要销毁旧视图,因为它包含对不再使用的先前活动的引用(呈现给用户)。保持使用旧上下文创建的任何视图都会导致内存泄漏。
如果由于某种原因(您的应用上的其他位置)您正在使用应用程序上下文来夸大视图,请不要这样做。活动上下文包含处理视图时所需的主题信息。
以下是一些建议: