在Android docs上的FragmentTransaction项目中,描述了方法replace()
与为当前视图中添加的所有片段调用方法remove()
相同,然后调用方法add()
。在这种情况下,要恢复先前的片段,我们可以使用addBackToStack()
,这意味着事务状态仍由片段管理器管理,并且在退出堆栈时将反转其操作。
[另一方面,当我们使用add()
实现事务时,除了使用add().addBackToStack()
之外,我们还可以使用detach()
方法并使用attach()
恢复片段,其行为与addBackToStack()
相同]。
那么这些场景之间的幕后有什么区别?
detach()
和addToBackStack ()
之间的区别在于Fragment的生命周期。当我们在后台堆栈中添加Fragment时,依次调用方法onPause()
,onStop()
和onDestroyView()
。在这种状态下,片段清理与其视图关联的资源,并“停留”在那里等待再次调用。从后栈返回布局称为方法onCreateView()
,仅用于片段绘制其用户界面。实际上,该片段不会被破坏。[另一方面,当我们使用detach()
删除或替换片段时,将首先引用的所有相同方法(onPause()
,onStop()
,onDestroyView()
)依次调用,并添加以下两种方法:onDestroy()
,以对片段的状态和onDetach()
进行最终清理,以将片段分离为不再与其活动关联。
[基本上,在幕后,它们没有相同的行为:使用addToBackStack()
,片段保持实例化,detach()
,没有。