开始片段为:

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/

10-12 00:30
查看更多