在 FragmentTransaction 中使用 add().addToBackStack()、add().detach() 和 replace().addToBackStack() 有啥区别?

Posted

技术标签:

【中文标题】在 FragmentTransaction 中使用 add().addToBackStack()、add().detach() 和 replace().addToBackStack() 有啥区别?【英文标题】:What's the difference between using add().addToBackStack(), add().detach() and replace().addToBackStack() in a FragmentTransaction?在 FragmentTransaction 中使用 add().addToBackStack()、add().detach() 和 replace().addToBackStack() 有什么区别? 【发布时间】:2012-11-22 03:16:41 【问题描述】:

androiddocs上的FragmentTransaction项中描述了replace()方法与当前视图中添加的所有Fragment调用remove()方法相同,然后调用add()方法。在这种情况下,为了恢复之前的分片,我们可以使用addBackToStack(),这意味着事务状态仍然由分片管理器管理,当我们出栈时会反转它的操作。

另一方面,当我们使用add() 实现事务时,除了使用add().addBackToStack() 之外,我们还可以使用detach() 方法和使用attach() 恢复片段,其行为与@ 987654330@。

那么这些场景在幕后有什么区别呢?

【问题讨论】:

【参考方案1】:

我研究得更多,显然detach()addToBackStack () 之间的区别在于Fragment 的生命周期。当我们在后栈中添加 Fragment 时,依次调用方法 onPause()onStop()onDestroyView() 之后。在这种状态下,片段清理与其视图关联的资源并“停留”在那里等待再次调用。从后栈返回布局被称为方法onCreateView(),只是为了让片段绘制它的用户界面。实际上,片段并没有被销毁。

另一方面,当我们使用detach() 删除或替换片段时,依次调用所有首先引用的相同方法(onPause()onStop()onDestroyView())添加这两个方法:@987654331 @,对片段的状态进行最终清理,onDetach(),将片段分离为不再与其活动关联。

基本上,在幕后,它们没有相同的行为:使用addToBackStack(),片段保持实例化,而detach(),不要。

【讨论】:

以上是关于在 FragmentTransaction 中使用 add().addToBackStack()、add().detach() 和 replace().addToBackStack() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

操作栏在 FragmentTransaction replace() 和 FragmentTransaction add() 上的行为方式

findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null

使用 getFragmentManager().beginTransaction() 在 Android 中为 FragmentTransaction 键入不匹配

当我使用 fragmentTransaction.add 方法时片段重叠

FragmentActivity 与使用 FragmentTransaction 管理 Fragment?

使用 FragmentTransaction 将数据发送到片段