一旦调用popBackStack(),当前片段会发生什么?

时间:2016-01-27 19:21:12

标签: android android-fragments

如果我加载了一个片段,片段A,并用片段B替换该片段,将片段A添加到backstack中,如下所示:

public void replaceFragment(Fragment frag, String fragTag) {
    mFragmentTransaction = mFragmentManager.beginTransaction();
    mFragmentTransaction.replace(R.id.fragmentContainer, frag, fragTag);
    mFragmentTransaction.addToBackStack(null);
    mFragmentTransaction.commit();
}

然后从片段B调用:

popBackStackImmediate();

然后再次加载片段A.片段B会发生什么?在我的代码中,我创建了一个新的Fragment B对象并使用我的replaceFragment()方法加载它,并重复该过程。每当我用B替换A并调用popBackStack()或者在调用popBackStack时B被销毁,我是否会创建一堆片段B?感谢。

1 个答案:

答案 0 :(得分:4)

在您的情况下,

popBackStack()会将您的上一笔交易撤销replace次交易。

FragmentTransaction文档非常清楚。取而代之的是:

  

替换添加到容器的现有片段。这是   与当前所有人调用remove(Fragment)基本相同   添加了使用相同containerViewId添加的片段   add(int,Fragment,String)与此处给出的参数相同。

因此,如果添加A并且您调用replace(container, B),则实际上是在调用

  • remove(A)
  • add(B)

尽管如此,用popBackStack()扭转此交易基本上是这样的:

  • remove(B)
  • add(A)

你问,A或B的哪个实例取决于你如何使用你的方法。据我所知,remove d片段将被销毁(除非你保留对它的引用)。如果您每次都致电new Fragment(),那么答案很简单 - 您正在创建大量实例。

FragmentTransaction API提供了另类方法来处理您的情况,您必须多次切换AB。这些都是有据可查的。例如,您可以使用hide()show()隐藏片段A并显示片段B,而不会收集垃圾并创建不必要的新实例。

此外,您可以使用detach()attach()。与show和hide的区别在于,片段视图(注意:不是片段实例)每次都会被销毁并重新创建。另一方面,隐藏和显示只是在不破坏视图的情况下使视图不可见。