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

时间:2015-08-07 17:41:37

标签: android android-fragments

我正在动态添加片段:

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

当我添加一个不同的片段R.id.learn_detail(这是一个Framelayout)时,我调用相同的代码

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

每次拨打mFragmentManager.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;
}

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

2 个答案:

答案 0 :(得分:2)

FragmentManager从UI中删除片段时,片段本身仍由FragmentManager管理。除了完成其活动之外,我还不知道如何明确告诉FragmentManager忘记"片段。

期望您将重用已创建的片段,而不是反复实例化新片段。例如,使用tag参数调用FragmentTransaction.add(),然后调用FragmentManager.findFragmentByTag()以获取对片段的引用。

答案 1 :(得分:0)

在Android中,Fragment自动管理后备堆栈。无论您是替换还是添加Fragment,都会将其添加到Fragment后筹码中。

您要问的是,每次要替换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();