我正在像这样动态添加一个片段:
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/