add()和;之间的区别用Fragment生命周期替换()

时间:2013-11-17 14:54:30

标签: android android-fragments fragment-lifecycle

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

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

Fragment1 添加 Fragment2 添加 Fragment3 添加 Fragment4 添加 Fragment5 替换 Fragment6 < / p>

显示其生命周期的log-cat(我在onCreate,onCreateView,onDestroyView,onDestroy中有一些printf-points用于跟踪)


标记 __ _ __ _ __ _ __ _ __ 文字

Fragment1_的 _ __ _ ___ _onCreate

Fragment1_的 _ __ _ ___ _onCreateView

Fragment1_ _ __ _ ___ _add Fragment2

Fragment2_的 _ __ _ ___ _onCreate

Fragment2_的 _ __ _ ___ _onCreateView

Fragment2_ _ __ _ ___ _add Fragment3

Fragment3_的 _ __ _ ___ _onCreate

Fragment3_的 _ __ _ ___ _onCreateView

Fragment3_ _ __ _ ___ _add Fragment4

Fragment4_的 _ __ _ ___ _onCreate

Fragment4_的 _ __ _ ___ _onCreateView

Fragment4_ _ __ _ ___ _add Fragment5

Fragment5_的 _ __ _ ___ _onCreate

Fragment5_的 _ __ _ ___ _onCreateView

Fragment5 __ _ __ _ < / em> _ 替换Fragment6

Fragment1 __ _ __ _ < / em> _ onDestroyView

Fragment3 __ _ __ _ < / em> _ onDestroyView

Fragment5 __ _ __ _ < / em> _ onDestroyView

Fragment6_的 _ __ _ ___ _onCreate

Fragment6_的 _ __ _ ___ _onCreateView


我的问题:

Fragment6将Fragment5 替换后,

为什么,Fragment1&amp; 3&amp; 5被摧毁了他们的观点?。

Fragment2&amp ;;正在发生什么 4?

为什么 Fragment2&amp; 4不会破坏他们作为Fragment1&amp; amp; 3&amp; 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();
}

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

当你替换时,你要换掉ViewGroup R.id.container中所有新的Fragment(6)的片段(1,2,3,4,5) 。一旦碎片被移除,它们将被销毁。销毁后,他们会调用onDestroyView()方法。

FragmentTransaction replace

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