android fragment 使用

官方:Fragment | App architecture | Android Developers

Android Fragment 的方法可以大致分为几类:生命周期回调方法事务操作方法状态判断与辅助方法。下面逐一详解。


一、生命周期回调方法(按调用顺序)

Fragment 的生命周期与 Activity 紧密相关,但有自己独特的回调。一个 Fragment 从创建到销毁,主要方法调用顺序如下:

onAttach()onCreate()onCreateView()onViewCreated()onStart()onResume()onPause()onStop()onDestroyView()onDestroy()onDetach()

方法 调用时机 主要用途 注意事项
onAttach() Fragment 与 Activity 绑定时最先调用 获取宿主 Activity 的引用,进行一些依赖 Activity 的初始化 此时视图尚未创建,不能操作 UI 控件
onCreate() Fragment 被创建时调用 初始化不依赖视图的数据、资源、ViewModel 等 适合恢复 Bundle 中保存的状态
onCreateView() 创建 Fragment 的视图层次时调用 加载布局,返回 Fragment 的根 View 必须实现,返回 null 表示无 UI
onViewCreated() onCreateView() 返回后立即调用 初始化 UI 控件、设置监听器、绑定数据 此时 getView() 不为 null,推荐在此操作视图
onStart() Fragment 对用户可见时调用 启动需要 UI 可见时才执行的逻辑 可见但尚未获得焦点,不能交互
onResume() Fragment 可交互时调用 启动动画、传感器监听等需要前台运行的逻辑 与 Activity 的 onResume 对应
onPause() Fragment 失去交互能力但仍可见时调用 暂停动画、传感器等消耗资源的操作 不能执行耗时操作
onStop() Fragment 完全不可见时调用 停止不必要的后台任务 可能被系统回收
onDestroyView() Fragment 的视图被销毁时调用 清理视图引用,避免内存泄漏 屏幕旋转时会调用,Fragment 实例可能还存活
onDestroy() Fragment 被销毁时调用 清理全局资源 此时视图已销毁
onDetach() Fragment 与 Activity 解绑时调用 释放对 Activity 的引用 最后调用的方法

关键理解 :Fragment 的生命周期分为Fragment 本身的生命周期视图(View)的生命周期 两部分。onCreateView / onDestroyView 是视图特有的,屏幕旋转时视图会被销毁重建,但 Fragment 实例可能存活,所以千万不要在 Fragment 中持有 View 的长引用。


二、Fragment 事务操作方法(FragmentTransaction)

这些方法用于在运行时动态管理 Fragment,通过 FragmentManager.beginTransaction() 获取事务对象后调用。

1. add()

将 Fragment 添加到容器中。

kotlin

复制代码
transaction.add(R.id.container, MyFragment(), "tag")
  • 多次 add 同一个 Fragment 实例会抛异常

  • 添加后 Fragment 进入 RESUMED 状态

2. remove()

从容器中移除 Fragment。

kotlin

复制代码
transaction.remove(fragment)
  • 需要传入已添加的 Fragment 实例(通过 findFragmentByIdfindFragmentByTag 获取)

  • 移除后 Fragment 进入 DESTROYED 状态

3. replace()

用新 Fragment 替换容器中现有的所有 Fragment。

kotlin

复制代码
transaction.replace(R.id.container, NewFragment(), "newTag")
  • 等效于 remove 所有当前 Fragment + add 新 Fragment

  • 常用场景:页面切换

4. show() / hide()

显示或隐藏已添加的 Fragment 的视图。

kotlin

复制代码
transaction.hide(oldFragment).show(newFragment).commit()
  • 不影响 Fragment 的生命周期 ,Fragment 仍保持在 STOPPED 状态

  • replace 性能更好,适合频繁切换的场景(如 Tab 切换)

  • 视图会被隐藏(setVisibility(View.GONE)),但不会销毁

5. addToBackStack()

将当前事务加入返回栈,用户按返回键时可以回退。

kotlin

复制代码
transaction.replace(R.id.container, DetailFragment())
    .addToBackStack(null)  // null 表示不命名
    .commit()
  • 不调用此方法,按返回键会直接退出 Activity

  • 传入 String 参数可以命名该返回栈状态,便于后续通过 popBackStack() 回退到指定状态

6. setReorderingAllowed()

允许系统对多个事务操作进行重新排序优化。

kotlin

复制代码
transaction.setReorderingAllowed(true)
  • 强烈推荐启用,可避免中间状态的 Fragment 经历不必要的生命周期变化

  • 在 AndroidX Fragment 库中,使用 commit { } 块时默认启用

7. commit()

提交事务,所有操作生效。

kotlin

复制代码
transaction.commit()
  • 必须在主线程调用

  • 提交后不能再修改该事务

8. commitNow()

同步提交事务,立即执行。

kotlin

复制代码
transaction.commitNow()
  • 适用于需要在同一帧内完成 Fragment 操作的情况

  • 不能与 addToBackStack() 一起使用


三、状态判断与辅助方法

这些是 Fragment 类中常用的辅助方法,用于在代码中判断 Fragment 的当前状态。

方法 返回值 说明
isAdded() Boolean Fragment 是否已添加到宿主 Activity
isVisible() Boolean Fragment 是否对用户可见
isDetached() Boolean Fragment 是否已从 Activity 分离
isRemoving() Boolean Fragment 是否正在被移除
getView() View? 获取 Fragment 的根视图,null 表示视图未创建或已销毁
getActivity() Activity? 获取宿主 Activity,可能为 null(在 onDetach 之后)
getContext() Context? 获取上下文,可能为 null
getLifecycle() Lifecycle 获取 Fragment 的 Lifecycle 对象
getViewLifecycleOwner() LifecycleOwner 获取视图的 LifecycleOwner

重要提示getViewLifecycleOwner()onViewCreated() 之后才可用,适合用于在视图存在期间才需要执行的操作(如观察 LiveData)。


四、状态保存与恢复方法

方法 说明
onSaveInstanceState(Bundle) 保存 Fragment 的状态,在 Fragment 被销毁前调用
onViewStateRestored(Bundle) 视图的状态恢复后调用
setRetainInstance(true) (已废弃)配置更改时保留 Fragment 实例

推荐使用 ViewModel + SavedStateHandle 来替代手动保存状态,更加安全和便捷。


五、与 Activity 通信的方法

方法 说明
requireActivity() 获取宿主 Activity,若为 null 则抛出异常(比 getActivity() 更安全)
requireContext() 获取上下文,若为 null 则抛出异常
setTargetFragment() (已废弃)设置目标 Fragment,用于结果回调,推荐使用 Fragment Result API 替代

六、快速参考:常用方法使用场景速查

场景 推荐方法
加载布局 onCreateView()
初始化控件 onViewCreated()
获取宿主 Activity requireActivity()
添加 Fragment add() + commit()
切换 Fragment(不保存状态) replace() + addToBackStack() + commit()
频繁切换(Tab) hide() / show() + commit()
按返回键回退 addToBackStack(null)
判断 Fragment 是否存活 isAdded()
判断视图是否存在 getView() != null
观察数据仅在视图存在时 getViewLifecycleOwner()
相关推荐
迷茫中的自我1 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
随遇丿而安2 小时前
第13周:页面状态保存 + 数据恢复优化
android
万事可爱^2 小时前
Claude 新发布的 Opus 5,系统提示语删了 80%,半价还能逼近 Fable 5
android·服务器·数据库·人工智能·claude
alexhilton3 小时前
响应式的Android身份验证架构
android·kotlin·android jetpack
喵都学不动了4 小时前
Android 自动化测试完全指南(新人版)
android
码云骑士4 小时前
76-全量微调vs-LoRA-vs-QLoRA-三种微调方式对比与选型
android
光头闪亮亮4 小时前
Fyne ( go跨平台GUI )项目实战-WebView 组件开发技术详解
android·go
嵌入式小周5 小时前
Genymotion 安卓模拟器在 Intel 芯片 Mac 上的运行(附带下载方式)
android·macos
zzq77977 小时前
Android 16 API 36 升级后 APP 加固兼容性问题解析
android·开发语言·安全·kotlin·安卓·安全架构