在片段事务中,addToBackStack和replace操作是否可以同时使用?

17

对于以下代码你有什么想法?在我的测试中,我发现替换的片段没有被销毁,在弹出后退栈时实例仍然存在。只是想确认这是否是使用片段事务的有效方法。

getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(frame, fragmentB).commit();

我使用 replace 的原因是它会使被替换的片段运行其退出动画。


我猜你有意保留替换的片段,但不想将其弹回? - Jason Hu
它将被弹出,这就是为什么我要将它添加到后退栈中的原因。我使用replace的原因是它会导致被替换的片段运行其退出动画。 - bgolson
2
在这种情况下,您正在按照应该的方式使用它。请参考http://developer.android.com/guide/components/fragments.html并搜索“transaction.addToBackStack(null);”。它是一样的。 - Jason Hu
哇!没想到文档里会有这个 :) 把它提交作为答案,我会接受的。谢谢Jason! - bgolson
1
我认为你忘记提交了。getFragmentManager().beginTransaction().replace(R.id.container, new ArticleFragment()).addToBackStack(null).commit(); - Zar E Ahmer
感谢指出缺失的提交,它在我的代码中已经存在了,只是忘记在这里键入。 - bgolson
1个回答

24
你可以参考android设计指南中的片段事务部分: http://developer.android.com/guide/components/fragments.html 具体来说,以下是代码片段:
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

所以,是的,你正在采取正确的方法替换片段。


例如:我们有Fragment_1、Fragment_2、Fragment_3。我们按照顺序多次调用transaction.replace(container, Fragment_X):1、2、3、1、3、2、1等。在每次使用transaction.replace(...)时,Fragment_1的所有实例都将是相同的还是每次都会重新创建?谢谢。 - Ewoks
1
@Ewoks transaction.replace 只是用第二个参数中传递的 Fragment 替换片段容器中当前存在的 Fragment。因此,在这个答案中,每次我都创建一个新的 ExampleFragment,因此每次 Fragment 都是全新的。如果你有对 Fragment 的引用,你不一定需要重新创建 Fragment,只需使用引用调用 transaction.replace 即可。但在你的示例中,如果选择保留相同的 Fragment_1/2/3,则用户在向后导航时会出现奇怪的后退堆栈。 - Jason Hu

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