Android:没有得到popBackStackImmediate()的行为

时间:2016-12-02 07:08:04

标签: android android-fragments fragment-backstack

我有3个片段,流程就像

  

片段1 - >片段2(将其添加到后台) - >片段3 - >片段1

由于我想再次从Fragment 3进入Fragment 1,我希望后面的堆栈是干净的,以便当用户按下时没有任何反应。

最初我已经清除了Fragment 3中的popback堆栈

Boolean isPoped = fManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

然后创建了我的片段1的新实例

HomeFragment homeFragment = HomeFragment.newInstance(mobileNumber, "");
FragmentTransaction transaction =fManager.beginTransaction();
transaction.replace(R.id.fragment_container, homeFragment);
transaction.commit();

造成的 android: ViewPager throwing null pointer

然后我评论了上面的代码,只使用了

Boolean isPoped = fManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

工作正常,因为它删除了交易(我相信)并带我到homeFragment,但那导致了View pager not instantiating post fragment popBackStackImmediate

这里我不知道popBackStack是如何工作的?我想要的只是将用户从片段3带到片段1并清除背斜。

1 个答案:

答案 0 :(得分:2)

我在另一个问题中看了你的代码,我想我明白了问题所在。

因此,您的第一个操作是创建Fragment 1并将其放入容器中。我没有看到代码,但无论如何;如果容器为空,则addreplace的行为方式相同。所以现在你的片段1在容器中。

您尚未在此处调用addToBackStack,因此FragmentManager不知道如何撤消此操作。这很好,这是第一次操作,不需要撤消。

接下来,您创建片段2并执行replace事务。片段1被片段2替换。这被推送到后栈,因此FragmentManager 知道如何撤消此事务。

接下来,您将创建片段3并执行replace事务。片段2被片段3替换。您不会将此操作推送到后栈。哦,哦。

现在,当你说popBackStack(延迟或立即)时,FragmentManager将撤消用片段1 替换片段2的操作,但片段2不再在容器中。所以(根据我的理解)FragmentManager会将Fragment 1放回容器中,但将Fragment 3留在那里。它不知道如何处理Fragment 3。

以下是我如何处理这些场景:假设我有Fragment 1,然后导航到Fragment 2.当我打算使用后退按钮转到Fragment 1时导航到Fragment 3,我这样做:

  1. 弹出后栈(立即,现在片段1回到容器中)然后
  2. 将片段1替换为片段3并将该操作推送到后栈。
  3. 现在,当我按下后退按钮时,FragmentManager知道如何撤消我的操作并将片段1放回到片段3所在的位置。这意味着我不必执行任何片段事务来处理这种后退导航,FragmentManager为我处理它。