📜  使用共享 ViewModel 在 Android 中进行片段到片段通信(1)

📅  最后修改于: 2023-12-03 14:49:52.885000             🧑  作者: Mango

使用共享 ViewModel 在 Android 中进行片段到片段通信

在 Android 应用中,经常需要进行片段之间的通信和数据共享。而共享 ViewModel 提供了一种非常方便、灵活的方式来实现这一目标。本文将介绍使用共享 ViewModel 在 Android 中进行片段到片段通信的方法。

什么是 ViewModel?

在 Android 应用中,ViewModel 是一种设计模式,它用于将 UI 控制器(例如 Activity 和 Fragment)与数据分离。ViewModel 存放应用程序的数据,并负责处理与数据相关的业务逻辑。ViewModel 不同于传统 MVC 设计模式中的控制器,它并不直接与 UI 组件进行交互。相反,ViewModel 通过观察者模式与 UI 控制器进行通信。

为什么使用共享 ViewModel?

在 Android 中,每个 Fragment 都有自己的生命周期,如果 Fragment 中的数据需要在其他 Fragment 中使用,就需要使用共享 ViewModel。共享 ViewModel 可以在多个 Fragment 之间共享数据,并且可以确保这些数据在整个应用程序中具有一致性。

共享 ViewModel 的好处:

  • 简化了代码,减少了冗余代码。
  • 支持 Fragment 之间的通信,避免重复查询或操作。
  • 可以确保数据的一致性。
如何使用共享 ViewModel?

在共享 ViewModel 中,ViewModel 的创建和管理都是由父 Fragment 负责的。因此,我们需要先在父 Fragment 中创建 ViewModel。

  1. 在父 Fragment 中创建共享 ViewModel

共享 ViewModel 必须属于 Fragment 的父 Fragment,这样才能使多个 Fragment 共享 ViewModel。因此,在创建 ViewModel 的时候,要使用 requireParentFragment() 方法指定它的父 Fragment。

class ParentFragment : Fragment() {
    private lateinit var sharedViewModel: SharedViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 从父 Fragment 中获取 ViewModel
        sharedViewModel = ViewModelProvider(requireParentFragment()).get(SharedViewModel::class.java)

        // 父 Fragment 中的布局文件
        val view = inflater.inflate(R.layout.fragment_parent, container, false)

        // 返回 Fragment 的视图
        return view
    }
}
  1. 创建共享 ViewModel

共享 ViewModel 可以是任何对象,但为了在多个 Fragment 中共享数据,我们应该使用 ViewModel() 类。

class SharedViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    fun setData(data: String) {
        _data.value = data
    }
}
  1. 在子 Fragment 中访问共享 ViewModel

我们可以使用 requireParentFragment() 方法获取父 Fragment 的 ViewModel。在子 Fragment 中,只需要访问 ViewModel 的实例即可。

class ChildFragment : Fragment() {
    private lateinit var sharedViewModel: SharedViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 从父 Fragment 中获取 ViewModel
        sharedViewModel = ViewModelProvider(requireParentFragment()).get(SharedViewModel::class.java)

        // 子 Fragment 中的布局文件
        val view = inflater.inflate(R.layout.fragment_child, container, false)

        // 点击按钮设置数据
        view.findViewById<Button>(R.id.button).setOnClickListener {
            sharedViewModel.setData("Hello World!")
        }

        // 观察数据变化
        sharedViewModel.data.observe(viewLifecycleOwner, Observer { data ->
            // 更新 UI
        })

        // 返回 Fragment 的视图
        return view
    }
}

现在,我们可以在子 Fragment 中访问共享 ViewModel,并在多个 Fragment 中共享数据。

小结

在 Android 应用中,共享 ViewModel 提供了一种便捷的方式来实现 Fragment 之间的通信和数据共享。通过使用共享 ViewModel,我们可以将应用程序的代码变得更加简洁和可读,减少了重复代码,并且可以确保数据的一致性。