了解片段事务期间片段的生命周期方法调用

新手上路,请多包涵

我创建了一个演示,以了解在片段事务的不同情况下调用了哪些所有片段生命周期的方法。虽然大多数调用都符合预期,但我仍然感到困惑的是我用粗体写的一些东西。

假设有两个分片 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 许可协议

阅读 270
2 个回答

这是否意味着在同一活动中添加新片段时不会调用当前片段的方法?

正确,您的第一个片段 A 只有在被移除或替换后才会受到影响(情况 2)。简单地添加另一个片段只会在片段 A 上显示片段 B,并且不应调用任何生命周期回调。

我期望的是?

由于 Fragment A 现在可见,因此调用了 Fragment A 的 onStart 方法

同样,由于片段 B 被添加到 A 之上,片段 A 不受 B 移除的影响。

未调用片段 A 的 onDestroy 和 onDetach 方法。为什么不调用它?Bcoz 根据文档方法 replace 删除容器中已有的任何片段,并将新片段添加到同一容器中

与简单的替换不同,当您将替换事务添加到后台堆栈时,您实际上是将第一个片段附加到它的活动上,只有它的视图被销毁。

一旦你 pop backstack 片段 B 被删除,片段 A 将重新创建它的视图 - 从 onCreateView() 开始。

原文由 Hanan Rofe Haim 发布,翻译遵循 CC BY-SA 4.0 许可协议

我运行一些日志以查看结果如下(就像在此处的活动中所做的一样: https ://stackoverflow.com/a/61299029/3904109

片段开始

On Fragment Launched (First Time)
———————————————————————
onAttach:
onCreateView:
onViewCreated:
onActivityCreated:
onStart:
onResume:

On Coming Back To Fragment (From another fragment)
———————————————————————
onCreateView:
onViewCreated:
onActivityCreated:
onStart:
onResume:

OnMaximize(Square Button-After Back Pressed)
———————————————————————
onAttach:
onCreateView:
onViewCreated:
onActivityCreated:
onStart:
onResume:

OnMaximize(Square Button-After Circle Button)
———————————————————————
onStart:
onResume:

OnMaximize(After Circle Button)
————————————————————————————————————————————————
onStart:
onResume:

片段停止

On Going To Another Fragment (Skipping 1 Fragment)
———————————————————————
onPause:
onStop:
onDestroyView:

On BackPressed - Reverse Triangle Button (App Minimized)
———————————————————————
onPause:
onStop:
onDestroyView:
onDestroy:
onDetach:

OnMinimize (Circle Button)
————————————————————————————————————————————————
onPause:
onStop:

OnMinimize (Square Button)
————————————————————————————————————————————————
onPause:
onStop:

Going To Another Activity
————————————————————————————————————————————————
onPause:
onStop:

Close The App
————————————————————————————————————————————————
onDestroyView:
onDestroy:

如果有人想重新创建以检查以下代码:

 public View onCreateView(@NonNull LayoutInflater inflater,
                         @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {

    Log.d("TAG",
          "onCreateView: ");
}

@Override
public void onAttach(Context context) {
    Log.d("TAG",
          "onAttach: ");
    super.onAttach(context);
}

@Override
public void onViewCreated(@NonNull View view,
                          @Nullable Bundle savedInstanceState) {

    Log.d("TAG",
          "onViewCreated: ");
    super.onViewCreated(view,
                        savedInstanceState);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    Log.d("TAG",
          "onActivityCreated: ");
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onStart() {
    Log.d("TAG",
          "onStart: ");
    super.onStart();
}

@Override
public void onResume() {

    Log.d("TAG",
          "onResume: ");

    reAttachListeners();
    super.onResume();
}

@Override
public void onPause() {
    super.onPause();

    Log.d("TAG",
          "onPause: ");
    removeListeners();

}

@Override
public void onStop() {
    Log.d("TAG",
          "onStop: ");
    super.onStop();
}

@Override
public void onDestroyView() {
    Log.d("TAG",
          "onDestroyView: ");
    super.onDestroyView();
}

@Override
public void onDestroy() {
    Log.d("TAG",
          "onDestroy: ");
    super.onDestroy();
}

@Override
public void onDetach() {

    Log.d("TAG",
          "onDetach: ");
    super.onDetach();
}

原文由 DragonFire 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题