开始片段为:
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)
我已经看过其他线程来解决此问题,但尚未奏效。
最佳答案
使用FragmentPagerAdapter
时,同样的问题非常普遍。如果框架希望您创建某些东西,请创建它。不涉及缓存。
此方法要求您创建一个新视图。
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
第一次启动片段时以及配置更改(例如屏幕旋转)后,将调用
onCreateView
。在那种情况下,旧视图需要销毁,因为它拥有对不再使用(呈现给用户)的先前活动的引用。保留使用旧上下文创建的任何视图都会导致内存泄漏。如果出于某种原因(在应用程序的其他位置)您正在使用应用程序上下文来扩大视图,请不要使用。活动上下文具有在使用视图时所需的主题信息。
这里有一些建议:
利用框架,不要反对它。
只有在拥有一段有效的代码之后,才能进行优化。
关于android - fragment java.lang.IllegalStateException:指定的子代已经有一个父代。您必须先在 child 的 parent 上调用removeView(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47397193/