三三要成为安卓糕手
之前已经学习了Activity的生命周期,今天来学习Fragment的生命周期,先附上官方提供的生命周期图,和自己总结的表格
生命周期方法 | 对应阶段(结合图片) | 功能注释 | ||
---|---|---|---|---|
onAttach | - | 当 Fragment 与 Activity 关联时会被调用,此时可获取 Activity 的引用。 | 附着,连接 | |
onCreate | CREATED阶段 | 当 Fragment 被创建时调用,用于初始化不依赖于视图的组件,不初始化 UI 元素。 | 创建Fragment | |
onCreateView | 用于创建 Fragment 的视图。 | 创建Fragment视图 | ||
onViewCreated | 当视图创建完成后调用,可在此初始化 UI 组件或绑定数据,此时视图已完全创建,可访问 UI 元素。 | 创建Fragment视图中的UI控件 | ||
onViewStateRestored | 在onCreateView() 之后、onStart() 之前调用,用于恢复先前保存的 Fragment 状态,与onSaveInstanceState 配对使用。 | |||
onActivityCreated | - | 当宿主 Activity 的 onCreate() 方法返回后调用,可在此与 Activity 交互或依赖于 Activity 的内容,从 API 28 开始已废弃,建议使用 onViewCreated。 | ||
onStart | STARTED阶段 | 当 Fragment 变为可见时调用,此时视图即将显示在屏幕上。 | ||
onResume | RESUMED阶段 | 当 Fragment 可与用户交互时调用,Fragment 处于活动状态,适合在此恢复暂停的操作或更新 UI。 | ||
onPause | STARTED阶段 | 当 Fragment 失去用户焦点但仍然可见时调用,可在此保存用户数据或暂停耗时操作。 | ||
onStop | CREATED阶段 | 当 Fragment 完全不可见时调用,适合在此保存状态或释放不再需要的资源。 | ||
onSaveInstanceState | CREATED阶段 | 在 Fragment 即将被销毁(如用户旋转屏幕或 Fragment 被放入后台)之前调用,作用是保存 Fragment 的瞬时状态到 Bundle 中,以便在恢复时使用。 | ||
onDestroyView | DESTROYED阶段 | 当与 Fragment 视图关联的资源被释放时调用,此时视图即将销毁,适合在此清理 UI 相关的资源。 | ||
onDestroy | 当 Fragment 不再需要时调用,通常用于清理全局资源,onDestroy 触发时,Fragment 的视图生命周期结束。 | |||
onDetach | - | 当 Fragment 与 Activity 解除关联时调用,Fragment 的生命周期结束。 |
Activity代码参考上一章,这是UI界面
public class MyFragment extends Fragment {
private static final String TAG = "MyFragment";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.layout_red, container, false);
TextView tvText = view.findViewById(R.id.tv_text);
tvText.setText("我是MyFragment里面的标签");
tvText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(),"弹个窗",Toast.LENGTH_SHORT).show();
}
});
Log.i(TAG, TAG +" onCreateView: 在这里关联视图");
return view;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
//当Fragment与Activity关联时会被调用。此时可以获取Activity的引用
//此时就可以直接获取getActivity
FragmentActivity activity = (FragmentActivity) getActivity();
Log.i(TAG, TAG + " onAttach: Fragment与Activity关联");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//当Fragment被创建时调用,用于初始化不依赖于视图的组件,例如获取资源或设置数据。
// 所以不要在这里初始化UI元素。
Log.i(TAG, TAG + " onCreate: Fragment被创建");
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//当视图创建完成后调用,可在此初始化UI组件或绑定数据。此时视图已经完全创建,可以访问UI元素。
Log.i(TAG, TAG + " onViewCreated: 视图已经完全创建,可以访问UI元素");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//当宿主Activity的onCreate()方法返回后调用,可在此与Activity交互或依赖于Activity的内容。
//从API 28开始已废弃,建议使用onViewCreated()就可以了。
Log.i(TAG, TAG + " onActivityCreated: 一个已废弃的方法");
}
@Override
public void onStart() {
super.onStart();
//当Fragment变为可见时调用,此时视图即将显示在屏幕上
Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");
}
@Override
public void onResume() {
super.onResume();
//当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。
Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");
}
@Override
public void onPause() {
super.onPause();
//当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。
Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");
}
@Override
public void onStop() {
super.onStop();
//当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。
Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
// 在onCreateView()之后、onStart()之前调用。
// 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。
Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
//在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。
// 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。
Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");
}
@Override
public void onDestroyView() {
super.onDestroyView();
//当与Fragment视图关联的资源被释放时调用。此时视图即将销毁,适合在此清理UI相关的资源。
Log.i(TAG, TAG + " onDestroyView: 视图即将销毁");
}
@Override
public void onDestroy() {
super.onDestroy();
//当Fragment不再需要时调用,通常用于清理全局资源。适合在此释放持久数据,比如成员变量、某些图片资源或对象资源等等。
//onDestroy触发时,Fragment 的视图生命周期结束
Log.i(TAG, TAG + " onDestroy: 已销毁,Fragment的视图生命周期结束");
}
@Override
public void onDetach() {
super.onDetach();
//当Fragment与Activity解除关联时调用。Fragment的生命周期结束
Log.i(TAG, TAG + " onDetach: Fragment与Activity解除关联时调用");
}
}
点击添加按钮,看看生命周期变化
官方是推荐在onViewCreated(视图创建完毕,初始化UI控件)中进行一些view操作的,比如说
但是在商业场景开发当中,多数情况是在onCreateView创建Fragment视图中,就可以进行一些view操作
提问:为什么此时视图还没有被完全的创建出来,我们就可以去查找到控件呢?
虽然当前我们的view视图还没有返回到我们的Fragment底层,但是我们的view已经创建出来了,并不是一个空的对象,只不过还没有附加到当前的屏幕上而已
onActivityCreated
方法其实onActivityCreated就是一个**回调通知方法**,宿主的onCreate()
完成后,告诉Fragment,Fragment就可以在这个方法中与宿主进行交互或者访问宿主的相关内容信息
从 Android API 28 开始,onActivityCreated
已被废弃,官方建议使用onViewCreated
替代,它更专注于 Fragment 视图相关的初始化、交互逻辑等操作
回顾一下:
我们在Activity的生命周期中恢复状态用的是onRestoreInstanceState方法
在Fragment中使用的是onViewStateRestored
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
// 在onCreateView()之后、onStart()之前调用。
// 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。
Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");
}
方法执行顺序在onViewCreated之后、 onStart之前 ;它会去判断当前Bundle中有没有数据,没有数据说明是第一次创建
@Override
public void onStart() {
super.onStart();
//当Fragment变为可见时调用,此时视图即将显示在屏幕上
Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");
}
@Override
public void onResume() {
super.onResume();
//当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。
Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");
}
@Override
public void onPause() {
super.onPause();
//当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。
Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");
}
@Override
public void onStop() {
super.onStop();
//当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。
Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
//在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。
// 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。
Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");
}
上划操作
可以往outState中存储一些数据
再从后台点回来
销毁相关的有三个方法
点击移除按钮
比Activity多了一个生命周期,多一个Detach
onDetach,跟Activity的destory不同,Fragment的destory是当前视图生命周期结束了,也就是UI结束了