【问题标题】:Fragment back stack clearing Issue分片回栈清除问题
【发布时间】:2017-11-09 10:18:49
【问题描述】:

我正在使用 fragments 和类似的导航流程

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

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

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

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

FragmentManager fm = getActivity().getSupportFragmentManager();

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

【问题讨论】:

  • 当您从 Frag C 移动到 Frag D 时,您使用的是替换,对吗?
  • 是的,我正在使用替换
  • 下面的答案中的解决方案。如果有效,请告诉我。快乐编码:)
  • 你试过了吗?
  • 不使用replace使用add(当你想在popUpBackStack上每次调用onCreateView调用时全部replace,当你不调用add方法时)

标签: android android-fragments android-alertdialog fragment-backstack


【解决方案1】:

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

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

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

不是那么干净:在 Fragment C 和 D 事务之间调用 add 而不是使用replace,这样当你在 Fragment D 中弹出 backstack 时,将不会调用 Fragment C onCreateView,因为 View 是从未销毁(从未调用过删除/替换)。

【讨论】:

  • 使用 add 方法对我来说很好,但我不明白你为什么说它不那么干净
  • 我不是说它不干净,我说它不是那么干净。使用 Fragment 替换可以让您完全控制容器中发生的事情,而使用 add 则不容易发生。这仍然是一个很好的方法。
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多