当前位置: 首页 > news >正文

【Android】Fragment生命周期详解

在这里插入图片描述

三三要成为安卓糕手

之前已经学习了Activity的生命周期,今天来学习Fragment的生命周期,先附上官方提供的生命周期图,和自己总结的表格

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生命周期方法对应阶段(结合图片)功能注释
onAttach-当 Fragment 与 Activity 关联时会被调用,此时可获取 Activity 的引用。附着,连接
onCreate
CREATED阶段
当 Fragment 被创建时调用,用于初始化不依赖于视图的组件,不初始化 UI 元素。创建Fragment
onCreateView用于创建 Fragment 的视图。创建Fragment视图
onViewCreated当视图创建完成后调用,可在此初始化 UI 组件或绑定数据,此时视图已完全创建,可访问 UI 元素。创建Fragment视图中的UI控件
onViewStateRestoredonCreateView() 之后、onStart() 之前调用,用于恢复先前保存的 Fragment 状态,与onSaveInstanceState 配对使用。
onActivityCreated-当宿主 Activity 的 onCreate() 方法返回后调用,可在此与 Activity 交互或依赖于 Activity 的内容,从 API 28 开始已废弃,建议使用 onViewCreated
onStartSTARTED阶段当 Fragment 变为可见时调用,此时视图即将显示在屏幕上。
onResumeRESUMED阶段当 Fragment 可与用户交互时调用,Fragment 处于活动状态,适合在此恢复暂停的操作或更新 UI。
onPauseSTARTED阶段当 Fragment 失去用户焦点但仍然可见时调用,可在此保存用户数据或暂停耗时操作。
onStopCREATED阶段当 Fragment 完全不可见时调用,适合在此保存状态或释放不再需要的资源。
onSaveInstanceStateCREATED阶段在 Fragment 即将被销毁(如用户旋转屏幕或 Fragment 被放入后台)之前调用,作用是保存 Fragment 的瞬时状态到 Bundle 中,以便在恢复时使用。
onDestroyViewDESTROYED阶段
当与 Fragment 视图关联的资源被释放时调用,此时视图即将销毁,适合在此清理 UI 相关的资源。
onDestroy当 Fragment 不再需要时调用,通常用于清理全局资源,onDestroy 触发时,Fragment 的视图生命周期结束。
onDetach-当 Fragment 与 Activity 解除关联时调用,Fragment 的生命周期结束。

一:总体代码

Activity代码参考上一章,这是UI界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

public class MyFragment extends Fragment {private static final String TAG = "MyFragment";@Nullable@Overridepublic 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() {@Overridepublic void onClick(View v) {Toast.makeText(getActivity(),"弹个窗",Toast.LENGTH_SHORT).show();}});Log.i(TAG, TAG +" onCreateView: 在这里关联视图");return view;}@Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context);//当Fragment与Activity关联时会被调用。此时可以获取Activity的引用//此时就可以直接获取getActivityFragmentActivity activity = (FragmentActivity) getActivity();Log.i(TAG, TAG + " onAttach: Fragment与Activity关联");}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//当Fragment被创建时调用,用于初始化不依赖于视图的组件,例如获取资源或设置数据。// 所以不要在这里初始化UI元素。Log.i(TAG, TAG + " onCreate: Fragment被创建");}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);//当视图创建完成后调用,可在此初始化UI组件或绑定数据。此时视图已经完全创建,可以访问UI元素。Log.i(TAG, TAG + " onViewCreated: 视图已经完全创建,可以访问UI元素");}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);//当宿主Activity的onCreate()方法返回后调用,可在此与Activity交互或依赖于Activity的内容。//从API 28开始已废弃,建议使用onViewCreated()就可以了。Log.i(TAG, TAG + " onActivityCreated: 一个已废弃的方法");}@Overridepublic void onStart() {super.onStart();//当Fragment变为可见时调用,此时视图即将显示在屏幕上Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");}@Overridepublic void onResume() {super.onResume();//当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");}@Overridepublic void onPause() {super.onPause();//当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");}@Overridepublic void onStop() {super.onStop();//当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");}@Overridepublic void onViewStateRestored(@Nullable Bundle savedInstanceState) {super.onViewStateRestored(savedInstanceState);// 在onCreateView()之后、onStart()之前调用。// 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");}@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);//在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。// 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");}@Overridepublic void onDestroyView() {super.onDestroyView();//当与Fragment视图关联的资源被释放时调用。此时视图即将销毁,适合在此清理UI相关的资源。Log.i(TAG, TAG + " onDestroyView: 视图即将销毁");}@Overridepublic void onDestroy() {super.onDestroy();//当Fragment不再需要时调用,通常用于清理全局资源。适合在此释放持久数据,比如成员变量、某些图片资源或对象资源等等。//onDestroy触发时,Fragment 的视图生命周期结束Log.i(TAG, TAG + " onDestroy: 已销毁,Fragment的视图生命周期结束");}@Overridepublic void onDetach() {super.onDetach();//当Fragment与Activity解除关联时调用。Fragment的生命周期结束Log.i(TAG, TAG + " onDetach: Fragment与Activity解除关联时调用");}
}

二:添加Fragment生命周期变化

点击添加按钮,看看生命周期变化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:view操作在哪个生命周期中进行

官方是推荐在onViewCreated(视图创建完毕,初始化UI控件)中进行一些view操作的,比如说

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是在商业场景开发当中,多数情况是在onCreateView创建Fragment视图中,就可以进行一些view操作

提问:为什么此时视图还没有被完全的创建出来,我们就可以去查找到控件呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然当前我们的view视图还没有返回到我们的Fragment底层,但是我们的view已经创建出来了,并不是一个空的对象,只不过还没有附加到当前的屏幕上而已

2:废弃的onActivityCreated方法

其实onActivityCreated就是一个**回调通知方法**,宿主的onCreate() 完成后,告诉Fragment,Fragment就可以在这个方法中与宿主进行交互或者访问宿主的相关内容信息

从 Android API 28 开始,onActivityCreated 已被废弃,官方建议使用onViewCreated 替代,它更专注于 Fragment 视图相关的初始化、交互逻辑等操作

3:视图状态恢复onViewStateRestored

回顾一下:

我们在Activity的生命周期中恢复状态用的是onRestoreInstanceState方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在Fragment中使用的是onViewStateRestored

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Overridepublic void onViewStateRestored(@Nullable Bundle savedInstanceState) {super.onViewStateRestored(savedInstanceState);// 在onCreateView()之后、onStart()之前调用。// 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");}

方法执行顺序在onViewCreated之后、 onStart之前 ;它会去判断当前Bundle中有没有数据,没有数据说明是第一次创建

4:显示视图和重新开始(可交互)

    @Overridepublic void onStart() {super.onStart();//当Fragment变为可见时调用,此时视图即将显示在屏幕上Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");}@Overridepublic void onResume() {super.onResume();//当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");}

三:上划切换到桌面再返回场景

1:上划到桌面场景

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    @Overridepublic void onPause() {super.onPause();//当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");}@Overridepublic void onStop() {super.onStop();//当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");}
@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);//在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。// 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");}

上划操作

可以往outState中存储一些数据

2:从后台点击回来场景

再从后台点回来

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四:移除Fragment场景

销毁相关的有三个方法

点击移除按钮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比Activity多了一个生命周期,多一个Detach

onDetach,跟Activity的destory不同,Fragment的destory是当前视图生命周期结束了,也就是UI结束了

http://www.dtcms.com/a/347087.html

相关文章:

  • 链表漫游指南:C++ 指针操作的艺术与实践
  • 【RK3576】【Android14】Android平台跟文件系统
  • PostgreSQL表分区与复杂查询性能优化实践指南
  • 【AI基础:神经网络】17、神经网络基石:从MP神经元到感知器全解析 - 原理、代码、异或困境与突破
  • 当 /etc/sysctl.d/ 目录下存在多个配置文件且配置项冲突时最终会使用哪个配置项
  • 嵌入式linux开发板 IP配置
  • Redis配置与数据类型详解及缓存优化实践
  • 使用VLLM部署大模型embedding/chat 的API
  • 秋招面试准备
  • Git的下载安装和使用以及和IDEA的关联
  • PLECS 中使用 C-Script 来模拟 NTC 热敏电阻(如 NTC3950B)
  • Spring Boot 校验分组(Validation Groups)高级用法全指南
  • 从词源和输出生成等角度详细解析PHP中常用文件操作类函数
  • Mac简单测试硬盘读写速度
  • 计算机网络 TLS握手中三个随机数详解
  • 鸿蒙应用网络开发实战:HTTP、WebSocket、文件下载与网络检测全攻略
  • Ubuntu 操作系统深度解析:从入门到精通(2025 最新版)
  • AP5414 LED驱动芯片:高效灵活,专业级照明解决方案
  • 20250823解决荣品RD-RK3588-MID核心板的底板的adb不通
  • Unity其他--【MMD】如何在Unity中制作MMD
  • Go数据结构与算法-常见的排序算法
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘arviz’问题
  • Boost.Asio 库中的 async_read_some用法
  • JAVA核心基础篇-操作符
  • 嵌入式LINUX——————网络TCP
  • 如何在Ubuntu中删除或修改已有的IP地址设置?
  • 在Excel和WPS表格中快速插入多行或多列
  • 生成一个竖直放置的div,宽度是350px,上面是标题固定高度50px,下面是自适应高度的div,且有滚动条
  • LeetCode算法日记 - Day 19:判定字符是否唯一、丢失的数字
  • 可转换债券高频交易Level-2五档Tick级分钟历史数据分析