我正在像这样动态添加一个片段:

        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;
}


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

最佳答案

FragmentManager从UI删除片段时,片段本身仍由FragmentManager管理。除了完成其活动之外,我不知道一种专门告诉FragmentManager“忘记”片段的方法。

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

关于android - 在FrameLayout中替换 fragment 不会从fragmentManager中删除现有 fragment ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31883681/

10-10 02:26