Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 替换FrameLayout中的片段不会从fragmentManager中删除现有片段_Android_Android Fragments - Fatal编程技术网

Android 替换FrameLayout中的片段不会从fragmentManager中删除现有片段

Android 替换FrameLayout中的片段不会从fragmentManager中删除现有片段,android,android-fragments,Android,Android Fragments,我正在动态添加一个片段,如下所示: FragmentManager fm = getChildFragmentManager(); mFragmentManager.beginTransaction().replace(R.id.learn_detail, detailFragment, LEARN_FRAGMENT_THREATS).commit(); mFragmentManager.executePendingTransactions();

我正在动态添加一个片段,如下所示:

        FragmentManager fm = getChildFragmentManager();
        mFragmentManager.beginTransaction().replace(R.id.learn_detail, detailFragment, LEARN_FRAGMENT_THREATS).commit();
        mFragmentManager.executePendingTransactions();
当我添加不同的片段R.id.learn\u detail(这是一个框架布局)时,我调用了相同的代码

片段被很好地替换了,但是我注意到旧片段仍然存在于内存中

调用
MFFragmentManager.getFragments
返回一个列表,该列表在每次调用
replace
时都会越来越大。我希望
replace
销毁旧片段并在FrameLayout中添加新片段。想法

编辑-我的问题是,无论发生什么,我总是在创建一个新片段。我的完整方法最终如下所示:

private LearnPageFragment getPageFragment(LearnPageItem item) {
    LearnPageFragment learnPageFragment = (LearnPageFragment) mFragmentManager.findFragmentByTag(LEARN_FRAGMENT_PAGE);

    if (learnPageFragment == null) {
        learnPageFragment = LearnPageFragment.newInstance(item);
    } else {
        //Destroy the view and update the item data
        mFragmentManager.beginTransaction().remove(learnPageFragment).commit();
        mFragmentManager.executePendingTransactions();
        learnPageFragment.getArguments().putSerializable(LearnPageFragment.k_CONTENT, item);
    }
    return learnPageFragment;
}

我接受了让我走上正轨的答案。我不应该试图手动从片段管理器中删除片段

在Android中,
Fragment
后台堆栈是自动管理的。无论您是否替换或添加
片段
,它都将添加到
片段
后堆栈中

解决问题的一种方法是,每次要替换
片段时,都可以清除回栈

在代码中添加以下行

FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
所以你的代码看起来像

FragmentManager fm = getChildFragmentManager();
FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
mFragmentManager.beginTransaction().replace(R.id.learn_detail,  detailFragment, LEARN_FRAGMENT_THREATS).commit();
mFragmentManager.executePendingTransactions();

FragmentManager
从UI中删除片段时,片段本身仍由
FragmentManager
管理。除了完成它的活动之外,我不知道有什么方法可以明确地告诉
FragmentManager
去“忘记”一个片段


我们的期望是,您将重用已经创建的片段,而不是一次又一次地实例化新片段。例如,使用标记参数调用
FragmentTransaction.add()
,然后调用
FragmentManager.findFragmentByTag()
以获取对片段的引用。

您应该先删除现有片段,然后添加新片段,而不是使用替换。:)这是我的想法。这不是替换的作用吗?现在测试你的建议。很有趣。因此,即使调用.addToBackStack(),片段也会添加到后堆栈中?编辑-我正在测试你的建议,谢谢你的回复。我认为这是正确的答案。每次点击时,我都会生成一个新片段,并且我不会检查savedInstanceState包是否为null。我会再处理这件事,然后再打给你。