我的程序有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();
}
答案 0 :(得分:6)
如果使用FragmentTransaction
来隐藏片段,那么它仍然可以处于其生命周期的运行状态,但是它的UI已经从窗口中分离出来,因此它不再可见。因此,您可以在技术上仍然与片段进行交互,并在以后需要时重新附加其UI。如果你替换了片段,那么你实际上是将它从容器中拉出来,它会经历生命周期中的所有拆解事件(onPause
,onStop
等),如果由于某种原因你再次需要该片段,你必须将它插回到容器中,让它再次运行它的所有初始化。
答案 1 :(得分:5)
当你替换时,你要换掉ViewGroup
R.id.container
中所有新的Fragment
(6)的片段(1,2,3,4,5) 。一旦碎片被移除,它们将被销毁。销毁后,他们会调用onDestroyView()
方法。
关于2和4的问题,我不确定。您是否能够发布更多写入logcat的代码?