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()
相关推荐
小孔龙9 小时前
GraphicBuffer 跨进程共享
android
行业研究员10 小时前
Android内置GPS与腾讯地图定位技术对比分析
android·android定位·腾讯地图定位
Android-Flutter10 小时前
android WMS 详解(二)
android·kotlin
游戏开发爱好者811 小时前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone
游戏开发爱好者812 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview
阿pin13 小时前
Android随笔-kotlin 高阶函数
android·kotlin·高阶函数
wxson72821 天前
【Android视频监控系统技术总结】
android·音视频
hunterandroid1 天前
[Android 从零到一] LiveData 粘性事件与单次消费:从重复触发到可靠事件总线
android
hunterandroid1 天前
[Android 从零到一] Android 事件分发机制:从 ACTION_DOWN 到 View 事件消费链路
android