add()和replace()与Fragment的生命周期之间的区别

tha*_*hnh 19 android android-fragments fragment-lifecycle

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

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

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

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 __ _ __ _ _ 替换Fragment6

片段1 __ _ __ _ _ onDestroyView

Fragment3 __ _ __ _ _ onDestroyView

Fragment5 __ _ __ _ _ onDestroyView

Fragment6_ _ __ _ ___ _onCreate

Fragment6_ _ __ _ ___ _onCreateView


我的问题:

为什么 Fragment5被Fragment6 取代后,Fragment1&3&5被破坏了他们的视野?

什么是与Fragment2和4 happending?

为什么 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();
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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


Ben*_*son 5

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

FragmentTransaction替换

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