如果加载了一个片段,则将片段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()时,我是否会创建一堆片段B?或者在调用popBackStack时B被销毁了吗?谢谢.
解决方法:
popBackStack()会撤消您的上一个事务(在您的情况下为替换事务).
FragmentTransaction文档对此非常清楚.替换功能:
Replace an existing fragment that was added to a container. This is
essentially the same as calling remove(Fragment) for all currently
added fragments that were added with the same containerVIEwID and then
add(int, Fragment, String) with the same arguments given here.
因此,如果添加了A并调用了replace(container,B),则实际上是在调用
>删除(A)
>加(B)
就是说,使用popBackStack()反转此事务实际上可以做到:
>删除(B)
>加(A)
您询问A或B的哪个实例,这取决于您使用方法的方式.据我所知,删除的片段将被销毁(除非您保留对其的引用).如果您每次都调用new Fragment(),那么答案很简单-您正在创建许多实例.
FragmentTransaction API提供了其他方式来处理类似您的情况,在这种情况下,您必须多次切换A和B.这些都是有据可查的.例如,您可以使用hide()
和show()
隐藏片段A并显示片段B,而无需收集垃圾并创建不必要的新实例.
另外,您可以使用detach()
和attach()
.show和hIDe的不同之处在于,这样片段视图(注意:不是片段实例)将每次都被销毁并重新创建.另一方面,隐藏和显示只是使视图不可见而不会破坏它.
以上是内存溢出为你收集整理的调用popBackStack()后,当前片段会发生什么?全部内容,希望文章能够帮你解决调用popBackStack()后,当前片段会发生什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)