24

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

假设有两个片段 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

暂停

停止

销毁视图

销毁

分离

4

3 回答 3

26

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

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

我期待的是什么?

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

同样,由于在 A 之上添加了片段 B,因此片段 A 不受删除 B 的影响。

未调用 Fragment A 的 onDestroy 和 onDetach 方法。为什么不调用它?Bcoz 根据文档方法替换删除容器中已经存在的所有片段并将新片段添加到同一容器中

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

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

于 2017-02-14T22:55:10.700 回答
3

我运行了一些日志来查看结果如下(就像在这里的活动中所做的那样: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();
}
于 2020-04-21T06:43:31.110 回答
-3

当片段可见或不可见时将调用setUserVisibleHint

于 2017-02-14T05:37:34.793 回答