官方: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 实例(通过
findFragmentById或findFragmentByTag获取) -
移除后 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() |