我有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并清除背斜。
答案 0 :(得分:2)
我在另一个问题中看了你的代码,我想我明白了问题所在。
因此,您的第一个操作是创建Fragment 1并将其放入容器中。我没有看到代码,但无论如何;如果容器为空,则add
和replace
的行为方式相同。所以现在你的片段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,我这样做:
现在,当我按下后退按钮时,FragmentManager
知道如何撤消我的操作并将片段1放回到片段3所在的位置。这意味着我不必执行任何片段事务来处理这种后退导航,FragmentManager
为我处理它。