Skip to content

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 紧密关联,但包含更多状态:
Fragment 生命周期示意图

关键生命周期方法

方法触发时机典型用途
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 共享数据。
  • 数据传递
    使用 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(推荐):
    使用 ViewModelLiveData 在 Fragment 间共享数据。
    kotlin
    class 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 应用的灵活性和用户体验。