我正在动态添加片段:
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;
}
我接受了让我走上正轨的答案。我不应该尝试从片段管理器中手动删除片段。
答案 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();