【发布时间】:2017-07-02 07:03:12
【问题描述】:
我创建了一个演示来了解在片段事务的不同情况下调用了所有片段生命周期的方法。虽然大多数调用都符合预期,但我仍然感到困惑的是我用粗体写的。
假设有两个片段 A 和 B,我们正在它们之间执行事务
案例一
当 Fragment B 添加到 Fragment A 时
getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, fragementB).addToBackStack(null).commit();
片段 B
附加
onCreate
onCreateView
onActivityCreated
开始
onResume
没有调用 Fragment A 的生命周期方法。
我的预期是什么?
由于 Fragment A 不可见,调用了 Fragment A 的 onStop 方法
根据文档-
已停止 - 片段不可见。要么主机活动已经 已停止或片段已从活动中删除但已添加 到后栈。停止的片段仍然存在(所有状态和 会员信息由系统保留)。然而,它不是 对用户可见的时间更长,如果活动被终止,将被杀死 被杀了。
这是否意味着在同一个activity中添加新的fragment时不会调用当前fragment的方法?
然后在片段 B 中使用popBackStack()
片段 B
暂停
在停止
onDestroyView
onDestroy
onDetach
没有调用 Fragment A 的生命周期方法
我的预期是什么?
Fragment A 的 onStart 方法被调用,因为 Fragment A 现在可见
案例 2
当片段 B 替换片段 A
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).commit();
片段 B
附加
onCreate
onCreateView
onActivityCreated
开始
onResume
片段 A
暂停
在停止
onDestroyView
onDestroy
onDetach
一切都如你所愿
案例 3
当 Fragment B 替换 Fragment A 时将其保留在 backstack 中
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).addToBackStack("tag").commit();
片段 B
附加
onCreate
onCreateView
onActivityCreated
开始
onResume
片段 A
暂停
在停止
onDestroyView
没有调用 Fragment A 的 onDestroy 和 onDetach 方法。为什么没有调用它?Bcoz 根据文档方法replace 删除容器中已经存在的所有片段并将新片段添加到同一个容器中强>
然后在片段 B 中使用popBackStack()
片段 A
onCreateView
onActivityCreated
开始
onResume
片段 B
暂停
在停止
onDestroyView
onDestroy
onDetach
【问题讨论】:
-
感谢 Hanan Rofe Haim..我已经在博客上详细发布了解释..它解释了片段交易期间的片段生命周期与最新的 appcompat 版本..查看 - androidlearnersite.wordpress.com/2017/02/27/…
标签: android android-fragments fragment-lifecycle