Fragment java.lang.IllegalStateException:指定的子级已有父级。您必须首先在孩子的父母上调用removeView()

时间:2017-11-20 16:56:26

标签: android android-fragments

启动片段:

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)

我已经看过修复此问题的其他主题,但尚无效。

1 个答案:

答案 0 :(得分:1)

使用FragmentPagerAdapter时,同样的问题非常受欢迎。 如果框架要求您创建某些内容,请创建它。不涉及缓存。

此方法要求您创建新视图。

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
首次启动片段时以及配置更改后调用

onCreateView,例如屏幕旋转。在这种情况下,需要销毁旧视图,因为它包含对不再使用的先前活动的引用(呈现给用户)。保持使用旧上下文创建的任何视图都会导致内存泄漏。

如果由于某种原因(您的应用上的其他位置)您正在使用应用程序上下文来夸大视图,请不要这样做。活动上下文包含处理视图时所需的主题信息。

以下是一些建议:

  1. 利用框架,不要反对它。
  2. 只有在您有一段代码后才能进行优化。