片段后退堆栈清除问题



我正在使用fragments和导航流程,例如

 Fragment A -> Fragment B -> Fragment C -> Fragment D 

表格 fragment D 我需要通过清除后退堆栈导航到 fragment A,但问题出在onCreateView() fragment C 的方法中,我正在显示一个对话框

当我通过清除后堆栈从 D 导航到 A 时 fragment 出现一个相同的弹出窗口,显示在片段 C 上

下面是我用来清除堆栈的代码

FragmentManager fm = getActivity().getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
     fm.popBackStack();
   }

您遇到的问题在于处理片段生命周期的方式。您希望片段 C 只执行一次onCreateView(以显示弹出窗口),但每次创建视图时都会调用onCreateView(例如,每次对片段调用 remove 时(替换工作原理几乎相同,删除 + 添加),然后使用 popbackstack 从后退堆栈添加它)。

对于您的问题,有两种解决方案:

更干净的一个:不是从onCreateView显示弹出窗口,而是从片段 C 中的onCreate调用它。这样,您将保证仅在创建片段实例时调用它。

不太干净:不要在片段 C 和 D 事务之间使用replace,而是调用 add,这样当你在片段 D 中弹出后退堆栈时,片段 C onCreateView不会被调用,因为视图从未被销毁(从未调用删除/替换)。

最新更新