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

3
如果我加载了一个片段,即片段A,并用片段B替换该片段,并将片段A添加到后退栈中,代码如下:
public void replaceFragment(Fragment frag, String fragTag) {
    mFragmentTransaction = mFragmentManager.beginTransaction();
    mFragmentTransaction.replace(R.id.fragmentContainer, frag, fragTag);
    mFragmentTransaction.addToBackStack(null);
    mFragmentTransaction.commit();
}

然后从片段B中,我调用:

popBackStackImmediate();

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

1个回答

4

popBackStack()可以撤销您上次的事务,对于您的情况来说就是一个replace事务。

FragmentTransaction文档已经很明确了。 replace的作用:

替换添加到容器中的现有片段。这本质上与为所有当前添加到相同containerViewId的片段调用remove(Fragment),然后使用此处给出的相同参数调用add(int,Fragment,String)相同。

所以,如果添加了A并调用replace(container, B),实际上您正在调用

  • remove(A)
  • add(B)

话虽如此,使用popBackStack()撤销此操作实际上是:

  • remove(B)
  • add(A)

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

FragmentTransaction API提供了另一种应对这种情况的替代方法,您必须多次切换A和B。这些再次得到很好的记录。例如,您可以使用hide()show()来隐藏片段A并显示片段B,而不会使A垃圾收集并创建不必要的新实例。

此外,您还可以使用detach()attach()。与show和hide的区别在于通过这种方式片段视图(注意:不是片段实例)将在每次销毁和重建。另一方面,显示和隐藏只是使视图不可见而不销毁它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接