一、Fragment的核心概念
-
定义与作用
Fragment是可重用的UI模块,代表Activity中的一部分界面。它拥有自己的布局、生命周期和事件处理逻辑,必须嵌入Activity或父Fragment中运行。
-
设计目的:
-
模块化:拆分复杂Activity为多个独立Fragment(如导航栏+内容区)。
-
复用性:同一Fragment可被多个Activity重用(如登录模块)。
-
响应式布局:自适应不同屏幕尺寸(平板左右分栏,手机底部导航)
-
-
2与Activity的关系
-
Fragment依赖Activity存在,通过
FragmentManager管理生命周期。 -
通信机制:
-
Activity → Fragment:通过
Bundle传递参数(setArguments())。 -
Fragment → Activity:定义接口回调(
onAttach()中获取接口实例)
-
二、Fragment生命周期详解
Fragment的生命周期包含11个回调方法,分为三个阶段:
-
创建阶段
-
onAttach():绑定到宿主Activity(获取Context引用)。 -
onCreate():初始化非UI资源(如数据加载)。 -
onCreateView():创建Fragment的UI布局(返回View对象)。 -
onViewCreated():视图创建后调用(绑定控件、设置监听)。 -
onActivityCreated():宿主Activity的onCreate()完成(可操作Activity视图)。
-
-
运行阶段
-
onStart():Fragment可见(启动动画/后台任务)。 -
onResume():获取用户焦点(注册广播/传感器)。 -
onPause():失去焦点(保存数据、释放资源)。 -
onStop():完全不可见(停止耗时操作)。
-
-
销毁阶段
-
onDestroyView():销毁视图(解绑控件引用,防止内存泄漏)。 -
onDestroy():清理资源。 -
onDetach():与Activity解绑(置空Context引用)
-
关键点:
-
视图生命周期(
onCreateView()~onDestroyView())独立于Fragment对象生命周期。 -
使用
getViewLifecycleOwner()监听视图相关的LiveData。
三、核心应用场景
-
多屏适配
-
平板:单Activity + 左侧导航Fragment + 右侧内容Fragment。
-
手机:底部导航栏切换不同Fragment(如微信首页)。
-
-
动态UI
-
运行时替换Fragment(如点击按钮切换详情页)。
-
支持动画过渡(
FragmentTransaction.setCustomAnimations())。
-
-
模块化设计
-
复用通用UI(如设置页面、评论组件)。
-
结合
ViewPager2实现滑动切换(如新闻分类)。
-
-
导航管理
-
使用Jetpack Navigation组件管理Fragment栈(
NavController处理返回键)
-
四、使用方式与最佳实践
-
添加Fragment到Activity
-
XML静态添加(简单场景)
-
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
android:name="com.example.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2. 动态添加(灵活控制):
supportFragmentManager.commit {
replace(R.id.fragment_container, MyFragment.newInstance())
setReorderingAllowed(true)
addToBackStack("detail") // 加入返回栈
}
-
避免常见问题
-
内存泄漏:
-
在
onDestroyView()中解绑控件和异步任务。 -
避免在Fragment中持有Activity强引用(用
WeakReference)。
-
-
状态丢失:
-
使用
onSaveInstanceState()保存临时数据。
-
-
嵌套过深:
-
用
getChildFragmentManager()管理子Fragment。
-
-
-
架构建议
-
单一职责:每个Fragment仅负责一个功能模块。
-
通信规范:
-
使用
ViewModel共享数据(替代直接Fragment间通信)。 -
事件传递采用
EventBus或LiveData。
-
-
五、与Activity的对比与选型
|
维度 |
Activity |
Fragment |
|---|---|---|
|
独立性 |
可独立运行 |
必须嵌入Activity |
|
复用性 |
低(界面与逻辑绑定) |
高(模块化设计) |
|
界面灵活性 |
适合全屏界面 |
适合局部动态更新 |
|
生命周期管理 |
复杂(需处理配置变更) |
轻量(依赖宿主Activity) |
总结
-
核心价值:Fragment通过模块化、复用性和响应式设计,解决复杂UI的开发与适配问题。
-
必知实践:
-
生命周期区分视图销毁(
onDestroyView())与对象销毁(onDestroy())。 -
使用
FragmentContainerView替代<fragment>标签(避免状态管理问题)。 -
优先采用Navigation组件管理导航栈,简化返回逻辑
-
1134

被折叠的 条评论
为什么被折叠?



