Android Fragments 详解指南
Fragment(碎片) 是 Android 开发中的一个核心组件,它可以被视为 Activity 界面中的一个“模块化部分”,Fragment 具有自己的生命周期,并且可以被添加到 Activity 中,也可以从其中移除。
为什么需要 Fragment?
Fragment 的引入主要是为了解决屏幕适配和界面复用的问题:
- 多面板布局:在平板电脑等大屏设备上,可以在一个界面显示两个 Fragment(如左侧列表,右侧详情);而在手机上则将它们分为两个独立的 Activity。
- 模块化开发:将复杂的界面拆分成多个独立的部分,提高代码的可维护性和可复用性。
- 动态界面管理:可以在运行时动态地添加、删除或替换界面内容,而无需重启整个 Activity。
Fragment 的生命周期
Fragment 的生命周期与 Activity 紧密相关,但它有自己的特有状态,重点关注以下阶段:
- onAttach()
:Fragment 与 Activity 建立关联。
- onCreate():初始化 Fragment(不涉及 UI)。
- onCreateView():关键步骤,在此方法中加载 XML 布局并返回 View 实例。
- onViewCreated():View 创建完成后调用,适合在此进行
findViewById或设置监听器。 - onPause() / onStop():用户离开 Fragment 时调用。
- onDestroyView():Fragment 的视图被销毁,但 Fragment 实例仍然存在。
- onDetach():Fragment 与 Activity 完全脱离。
如何使用 Fragment
1 静态添加(通过 XML)
直接在 Activity 的布局文件中使用 <fragment> 或 FragmentContainerView 标签,这种方式在编译时就确定了,无法在运行时动态更改。
2 动态添加(通过代码)
这是最常用的方式,通过 FragmentManager 和 FragmentTransaction 来实现。
- 核心步骤:
- 在布局中定义一个容器(如
)。FrameLayout
- 获取
supportFragmentManager。 - 开启事务
beginTransaction()。 - 调用
replace()或add()。 - 调用
commit()提交更改。
- 在布局中定义一个容器(如
代码示例:
val fragment = HomeFragment()
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null) // 将操作添加到返回栈,点击返回键可回退
.commit()
Fragment 之间的通信
Fragment 不应该直接互相调用,因为这会造成强耦合,推荐以下三种通信方式:
- ViewModel (推荐):使用 Activity 范围的
ViewModel,两个 Fragment 共享同一个 ViewModel 实例,通过LiveData或StateFlow观察数据变化。 - Fragment Result API:适用于简单的单向数据传递,使用
setFragmentResult发送结果,setFragmentResultListener接收结果。
- 接口回调 (传统方式):Fragment 定义一个接口,由 Activity 实现该接口,再通过接口将数据传递给另一个 Fragment。
最佳实践与注意事项
- 使用 FragmentContainerView:相比于
FrameLayout,FragmentContainerView能够更好地处理 Fragment 的生命周期和动画。 - 避免在 Fragment 中持有 View 的强引用:在
onDestroyView()中将 View 绑定(如 Binding 类)置为null,防止内存泄漏。 - 优先使用 Navigation 组件:对于复杂的页面跳转,建议使用 Jetpack Navigation 库,它将 Fragment 的跳转逻辑可视化,并简化了
FragmentManager的操作。 - 区分 add() 和 replace():
- add():将新 Fragment 叠加在旧 Fragment 之上,旧的仍处于
RESUMED状态。 - replace():先移除旧的,再添加新的,旧的会执行
onDestroyView。
- add():将新 Fragment 叠加在旧 Fragment 之上,旧的仍处于
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/487723.html



