如何清除支持FragmentManager的backStack?

时间:2015-07-11 19:40:54

标签: android android-fragments back-stack fragmenttransaction fragment-backstack

有没有办法,如何清除backStack支持FragmentManager而不在存储的片段中调用onCreateView()?

我理解片段lyfe循环并在弹出时调用onDestroyView()和onCreateView()。 API DOC

我也知道如何使用

从backstack弹出所有片段
mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {            
     mFragmentManager.popBackStack();
}

但两种方式都调用onCreateView()和其他lyfe循环方法,直到onDestroyView()和onDestroy()。

但有没有办法,如何清除这个后台堆栈只能从onDestroyView()而不是onCreateView()(片段内)调用?

或者有什么方法可以通过清除以前的片段来替换事务吗?

例如,在进行交易之前,我想要明确的回溯:

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction().replace(R.id.content, fragment).commit();

1 个答案:

答案 0 :(得分:0)

我还没有找到解决这个问题的简单方法。我几乎可以肯定,没有FragmentManagerFragment的功能允许您控制从堆栈弹出片段时调用哪个生命周期方法。我将概述两种可能的方法。每个都有一些不良方面。

第一种方法假设您从后台堆中弹出的片段是活动的子项。如果它们是片段的子元素,则该方法仍然适用,只是一种不同类型的父对象。

使用getter方法向活动(或父片段)添加布尔成员mClearingBackStack。当您开始完全清除后台堆叠时,设置布尔。在要禁用处理的片段生命周期方法中,获取标志并相应地修改处理。对于onCreateView()onDestroyView(),片段将被附加,主机活动可用getActivity()。将它转换为您的活动类,以使用标记的getter方法。

因为popBackStack()是异步的,所以只有在堆栈展开完成后才能清除标志。我还没有尝试过,但我认为在调用popBackStack()之后发布Runnable以清除该标志应该有效。由于Runnable需要在队列末尾,因此必须使用View.post()而不是Activity.runOnUiThread()。另一种方法是调用executePendingTransactions()等待堆栈展开完成。

如果你的设计可以容纳它,第二种方法更清洁。创建占位符片段,该片段是您的活动的子项,并且是您所有其他片段的父项。对于您现在拥有的所有片段交易,请使用使用getChildFragmentManager()获得的新片段FragmentManager。如果要清除所有这些事务,而不是弹出子片段管理器的堆栈,请删除或替换活动的片段管理器中的父片段。当删除父片段时,它的所有子片段都会被销毁,并通过拆卸步骤,onDestroyView(),onDestroy()等,但如果其背板被展开则会发生的所有步骤。这种方法比第一种方法更简单,更易于维护,但需要您重新处理片段层次结构。此方法的另一个问题是您必须添加一些代码来处理带有片段层次结构的Back操作。问题和各种解决方案被描述为here