21

我的程序有 6 个片段:Fragment1、Fragment2、....->Fragment6。

我使用 add() 和 replace() 语句在片段之间切换并跟踪它们的生命周期。

Fragment1添加Fragment2添加Fragment3添加Fragment4添加Fragment5替换Fragment6

显示它们的生命周期的日志猫(我在 onCreate、onCreateView、onDestroyView、onDestroy 中有一些 printf 点用于跟踪)


标签 __ _ __ _ __ _ __ _ __ 文字

片段1_ _ __ _ ___ _onCreate

片段1_ _ __ _ ___ _onCreateView

片段1_ _ __ _ ___ _添加片段2

片段2_ _ __ _ ___ _onCreate

片段2_ _ __ _ ___ _onCreateView

片段2_ _ __ _ ___ _添加片段3

片段3_ _ __ _ ___ _onCreate

片段3_ _ __ _ ___ _onCreateView

片段3_ _ __ _ ___ _添加片段4

片段4_ _ __ _ ___ _onCreate

片段4_ _ __ _ ___ _onCreateView

片段4_ _ __ _ ___ _添加片段5

片段5_ _ __ _ ___ _onCreate

片段5_ _ __ _ ___ _onCreateView

片段5 __ _ __ _ _ 替换 Fragment6

片段1 __ _ __ _ _ onDestroyView

片段3 __ _ __ _ _ onDestroyView

片段5 __ _ __ _ _ onDestroyView

片段6_ _ __ _ ___ _onCreate

片段6_ _ __ _ ___ _onCreateView


我的问题:

为什么Fragment5 被 Fragment6替换后, Fragment1 & 3 &5 被破坏了他们的视图?

Fragment2 & 4 发生了什么

为什么Fragment2 & 4 没有破坏他们作为 Fragment1 & 3 &5 的观点?

请帮助我在调用 add() 和 replace() 方法时充分了解片段的生命周期。


更新我的 addFragment 和 replaceFragment 方法:

public void addFragment(Fragment fromFragment, Fragment toFragment) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.container,toFragment, toFragment.getClass().getName());
    transaction.hide(fromFragment);
    transaction.addToBackStack(toFragment.getClass().getName());
    transaction.commit();
}

public void replaceFragment(Fragment fromFragment, Fragment toFragment) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.container,toFragment, toFragment.getClass().getName());
    transaction.hide(fromFragment);
    transaction.addToBackStack(toFragment.getClass().getName());
    transaction.commit();
}
4

2 回答 2

7

如果使用 aFragmentTransaction来隐藏 Fragment,那么它仍然可以处于其生命周期的运行状态,但它的 UI 已经从窗口中分离出来,因此不再可见。因此,从技术上讲,您仍然可以与片段交互,并在以后需要时重新附加其 UI。如果您替换片段,那么您实际上是将其从容器中拉出,它将经历生命周期中的所有拆卸事件(onPause,onStop等),如果由于某种原因您再次需要该片段,则必须插入它回到容器中,让它再次运行所有的初始化。

于 2014-07-15T09:31:27.593 回答
5

当您替换时,您正在将所有片段 (1,2,3,4,5) 换成ViewGroup R.id.container新的Fragment(6)。一旦碎片被移除,它们将被销毁。销毁时,它们将调用该onDestroyView()方法。

片段交易替换

关于您对 2 和 4 的问题,我不确定。您能否发布更多写入 logcat 的代码?

于 2013-11-17T18:52:13.360 回答