0

我发现了一些有趣的片段。我创建了活动并添加了两个片段:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.main, new Fragment1());
ft.add(R.id.main, new Fragment2());
ft.commit();

然后我添加了带有代码的按钮:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main, new Fragment1());
ft.commit();

如果我按第一次 - Fragment1 正在破坏,如果我第二次按 - Fragment2 正在破坏。为什么会这样?我认为如果我要更换碎片,那么应该清理容器“主”。

4

4 回答 4

1

看看文档

“这本质上与为所有当前添加的片段调用 remove(Fragment) 相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数添加(int, Fragment, String)。”

于 2013-12-12T10:59:14.517 回答
1

首先,我不会将两个片段添加到同一个容器中。如果您想使用同一个容器,我的建议是在第三个容器中使用 2 个容器

如果您需要将两个片段添加到同一个容器中,您可以通过保留它们的对象(或以某种方式引用它们)来手动摆脱它们。

例如,这使用完全限定FragmentTransaction.add()以便以后引用片段

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.main, new Fragment1(), "frag1");
ft.add(R.id.main, new Fragment2(), "frag2");
ft.commit();

// Later on
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Manually remove fragments
ft.remove(getSupportFragmentManager().findFragmentByTag("frag1"));
ft.remove(getSupportFragmentManager().findFragmentByTag("frag2"));
ft.add(R.id.main, new Fragment1(), "newFrag1");
ft.commit();

据我了解,依靠替换来摆脱同一个容器内的多个片段的问题在于,它将替换“当前显示”的不是整个容器(尽管,阅读FragmentTransaction 上的文档 - 它确实使它听起来就像你应该能够做你正在做的事情)。

于 2013-07-15T23:56:44.827 回答
0

假设片段 f1 和 f2 如果你替换 f1 上的 f2 片段然后 f1 片段 onpause ondestroyview ondestroy ondetach

和 f2 oncreate oncreateview onactivitycreated onstart onresume

如果你在 f1 上添加 f2 然后 f1 onpause 和 f2 oncreate oncreateview onactivitycreated onstart onresume

被称为

于 2014-09-18T10:32:59.290 回答
0

Try to use addToBackStack(null) after the replace:

ft.replace(R.id.main, new Fragment1());
ft.addToBackStack(null)
ft.commit();
于 2012-10-23T17:50:06.287 回答