我创建了一个演示,以了解在片段事务的不同情况下调用了哪些所有片段生命周期的方法。虽然大多数调用都符合预期,但我仍然感到困惑的是我用粗体写的一些东西。
假设有两个分片 A 和 B,我们正在它们之间进行交易
情况1
当 Fragment B 添加到 Fragment A 时
getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, fragementB).addToBackStack(null).commit();
片段B
附上
创建时
onCreateView
onActivityCreated
启动时
恢复时
没有调用 Fragment A 的生命周期方法。
我期望的是?
由于 Fragment A 不可见,因此调用了 Fragment A 的 onStop 方法
根据文档-
已停止 - 片段不可见。主机活动已停止或片段已从活动中删除但已添加到返回堆栈。停止的片段仍然存在(系统保留所有状态和成员信息)。但是,它不再对用户可见,如果 Activity 被终止,它也会被终止。
这是否意味着在同一活动中添加新片段时不会调用当前片段的方法?
然后在片段 B 中使用 popBackStack()
片段B
暂停
停止
onDestroyView
销毁时
分离
没有调用 Fragment A 的生命周期方法
我期望的是?
由于 Fragment A 现在可见,因此调用了 Fragment A 的 onStart 方法
案例二
当 Fragment B 替换 Fragment A 时
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).commit();
片段B
附上
创建时
onCreateView
onActivityCreated
启动时
恢复时
片段A
暂停
停止
onDestroyView
销毁时
分离
一切都符合预期
案例三
当 Fragment B 替换 Fragment A 时,将其保留在 backstack 中
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).addToBackStack("tag").commit();
片段B
附上
创建时
onCreateView
onActivityCreated
启动时
恢复时
片段A
暂停
停止
onDestroyView
未调用片段 A 的 onDestroy 和 onDetach 方法。为什么不调用它?Bcoz 根据文档方法 replace
删除容器中已有的任何片段并将新片段添加到同一容器
然后在片段 B 中使用 popBackStack()
片段A
onCreateView
onActivityCreated
启动时
恢复时
片段B
暂停
停止
onDestroyView
销毁时
分离
原文由 Android Developer 发布,翻译遵循 CC BY-SA 4.0 许可协议
正确,您的第一个片段 A 只有在被移除或替换后才会受到影响(情况 2)。简单地添加另一个片段只会在片段 A 上显示片段 B,并且不应调用任何生命周期回调。
同样,由于片段 B 被添加到 A 之上,片段 A 不受 B 移除的影响。
与简单的替换不同,当您将替换事务添加到后台堆栈时,您实际上是将第一个片段附加到它的活动上,只有它的视图被销毁。
一旦你 pop backstack 片段 B 被删除,片段 A 将重新创建它的视图 - 从 onCreateView() 开始。