4

有什么办法,如何在存储片段中不调用 onCreateView() 的情况下清除支持 FragmentManager 的 backStack?

我了解片段生命周期并在弹出时调用 onDestroyView() 和 onCreateView()。 http://developer.android.com/guide/components/fragments.html#Creating

我也知道如何从后台弹出所有片段

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

或者

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

但两种方法都调用 onCreateView() 和其他生命周期方法,直到 onDestroyView() 和 onDestroy()。

但是有什么办法,如何通过仅从 onDestroyView() 而不是从 onCreateView() (片段内部)调用来清除这个后台堆栈?

或者有什么办法可以用清除以前的片段来替换事务?

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

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

1 回答 1

0

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

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

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

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

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

于 2015-07-12T19:58:25.223 回答