在 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 方法时片段重叠