我创建了一个演示,以了解在片段事务的不同情况下调用了哪些片段生命周期的方法。虽然大多数调用都符合预期,但我仍然对我用粗体写的东西感到困惑。
假设有两个片段 A 和 B,我们正在它们之间执行事务
情况1
当 Fragment B 添加到 Fragment A 时
getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, fragementB).addToBackStack(null).commit();
片段 B
附加
创建
onCreateView
onActivityCreated
开始
恢复
没有调用片段 A 的生命周期方法。
我期待的是什么?
由于 Fragment A 不可见,因此调用 Fragment A 的 onStop 方法
根据文档-
已停止 - 片段不可见。主机活动已停止,或者片段已从活动中删除但已添加到后台堆栈。已停止的片段仍然存在(系统保留所有状态和成员信息)。但是,它不再对用户可见,并且如果该活动被终止,它将被终止。
这是否意味着在同一活动中添加新片段时不会调用当前片段的方法?
然后popBackStack()
在片段 B 中使用
片段 B
暂停
停止
销毁视图
销毁
分离
没有调用片段 A 的生命周期方法
我期待的是什么?
由于 Fragment A 现在可见,因此调用 Fragment A 的 onStart 方法
案例2
当 Fragment B 替换 Fragment A 时
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).commit();
片段 B
附加
创建
onCreateView
onActivityCreated
开始
恢复
片段 A
暂停
停止
销毁视图
销毁
分离
一切都如预期
案例3
当 Fragment B 替换 Fragment A 时,将其保留在 backstack 中
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).addToBackStack("tag").commit();
片段 B
附加
创建
onCreateView
onActivityCreated
开始
恢复
片段 A
暂停
停止
销毁视图
没有调用 Fragment A 的 onDestroy 和 onDetach 方法。为什么没有调用它?Bcoz 根据文档方法replace
删除容器中已经存在的所有片段并将新片段添加到同一个容器中
然后popBackStack()
在片段 B 中使用
片段 A
onCreateView
onActivityCreated
开始
恢复
片段 B
暂停
停止
销毁视图
销毁
分离