Fragment 是 Android 开发中用于构建灵活用户界面的核心组件,可以理解为 “界面模块” 或 “子 Activity”。以下是其核心概念和作用的详细解析:
1. Fragment 是什么?
- 定义:
Fragment 是一种可嵌入 Activity 中的 模块化 UI 单元,拥有自己的生命周期和用户交互逻辑。 - 核心特点:
- 复用性:同一 Fragment 可在不同 Activity 或布局中重复使用。
- 灵活性:动态组合多个 Fragment,适配手机/平板等不同屏幕尺寸。
- 生命周期:与宿主 Activity 生命周期关联,但可独立管理视图状态。
2. 为什么需要 Fragment?
场景 | 传统 Activity 的局限 | Fragment 的解决方案 |
---|---|---|
多屏适配 | 需为不同屏幕尺寸编写多个 Activity | 同一 Activity 内动态切换 Fragment |
界面模块化 | 复杂 Activity 代码臃肿 | 拆分功能为独立 Fragment,代码解耦 |
复用 UI 逻辑 | 难以复用界面组件 | Fragment 可跨多个 Activity 复用 |
3. Fragment 的生命周期
Fragment 的生命周期与宿主 Activity 紧密关联,但包含更多状态:
关键生命周期方法:
方法 | 触发时机 | 典型用途 |
---|---|---|
onAttach() | Fragment 关联到 Activity 时调用 | 获取 Activity 引用 |
onCreateView() | 创建 Fragment 的视图时调用 | 加载布局文件 (inflate ) |
onViewCreated() | 视图创建完成后调用 | 初始化控件、绑定数据 |
onStart() | Fragment 可见时调用 | 启动动画或传感器监听 |
onPause() | Fragment 失去焦点时调用 | 保存临时数据 |
onDestroyView() | Fragment 视图被销毁时调用 | 释放视图相关资源 |
onDetach() | Fragment 与 Activity 解除关联时调用 | 清理 Activity 引用 |
4. Fragment 与 Activity 的关系
- 依赖关系:
Fragment 必须嵌入到 Activity 中,不能独立存在。 - 通信方式:
- Activity → Fragment:通过
FragmentManager
查找 Fragment 并调用其方法。 - Fragment → Activity:通过接口回调或
ViewModel
共享数据。
- Activity → Fragment:通过
- 数据传递:
使用Bundle
通过setArguments()
传递初始参数。
5. 基础用法示例
(1) 定义 Fragment
kotlin
class MyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 加载布局文件
return inflater.inflate(R.layout.fragment_my, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 初始化控件
val button = view.findViewById<Button>(R.id.button)
button.setOnClickListener {
// 处理点击事件
}
}
}
(2) 在 Activity 中添加 Fragment
xml
<!-- Activity 布局中预留 Fragment 容器 -->
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
kotlin
// 在 Activity 中动态添加 Fragment
supportFragmentManager.commit {
replace(R.id.fragment_container, MyFragment())
addToBackStack("my_fragment") // 可选:加入回退栈
}
6. 高级功能
(1) Fragment 间通信
- 通过 ViewModel(推荐):
使用ViewModel
和LiveData
在 Fragment 间共享数据。kotlinclass SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // 在 Activity 中获取 ViewModel val viewModel: SharedViewModel by activityViewModels() // Fragment 发送数据 viewModel.data.value = "Hello" // 另一个 Fragment 接收数据 viewModel.data.observe(viewLifecycleOwner) { value -> // 更新 UI }
(2) 嵌套 Fragment
kotlin
// 在父 Fragment 中添加子 Fragment
childFragmentManager.commit {
replace(R.id.child_container, ChildFragment())
}
(3) 使用 Navigation 组件管理 Fragment
kotlin
// 在 Navigation Graph 中定义 Fragment 跳转逻辑
val navController = findNavController(R.id.nav_host_fragment)
navController.navigate(R.id.action_to_detail)
7. 常见问题与解决方案
问题 | 解决方案 |
---|---|
Fragment 重叠 | 检查 savedInstanceState ,避免重复添加 Fragment |
内存泄漏 | 在 onDestroyView() 中释放资源,避免持有 Activity 或 View 的强引用 |
回退栈管理混乱 | 使用 addToBackStack(null) 时指定唯一名称,或通过 FragmentManager 管理 |
视图状态丢失 | 通过 onSaveInstanceState() 保存数据,在 onViewStateRestored() 恢复 |
总结
- 核心价值:Fragment 是构建 模块化、响应式 UI 的核心工具,尤其适合多屏适配和复杂界面拆分。
- 适用场景:
- 底部导航栏切换不同界面
- 平板设备的 Master-Detail 布局
- ViewPager2 中的分页内容
- 动态加载不同 UI 模块
掌握 Fragment 的使用,能显著提升 Android 应用的灵活性和用户体验。