如果我加载了一个片段,片段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?感谢。
答案 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提供了另类方法来处理您的情况,您必须多次切换A
和B
。这些都是有据可查的。例如,您可以使用hide()
和show()
隐藏片段A并显示片段B,而不会收集垃圾并创建不必要的新实例。
此外,您可以使用detach()
和attach()
。与show和hide的区别在于,片段视图(注意:不是片段实例)每次都会被销毁并重新创建。另一方面,隐藏和显示只是在不破坏视图的情况下使视图不可见。