📅  最后修改于: 2023-12-03 14:49:52.885000             🧑  作者: Mango
在 Android 应用中,经常需要进行片段之间的通信和数据共享。而共享 ViewModel 提供了一种非常方便、灵活的方式来实现这一目标。本文将介绍使用共享 ViewModel 在 Android 中进行片段到片段通信的方法。
在 Android 应用中,ViewModel 是一种设计模式,它用于将 UI 控制器(例如 Activity 和 Fragment)与数据分离。ViewModel 存放应用程序的数据,并负责处理与数据相关的业务逻辑。ViewModel 不同于传统 MVC 设计模式中的控制器,它并不直接与 UI 组件进行交互。相反,ViewModel 通过观察者模式与 UI 控制器进行通信。
在 Android 中,每个 Fragment 都有自己的生命周期,如果 Fragment 中的数据需要在其他 Fragment 中使用,就需要使用共享 ViewModel。共享 ViewModel 可以在多个 Fragment 之间共享数据,并且可以确保这些数据在整个应用程序中具有一致性。
共享 ViewModel 的好处:
在共享 ViewModel 中,ViewModel 的创建和管理都是由父 Fragment 负责的。因此,我们需要先在父 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
}
}
共享 ViewModel 可以是任何对象,但为了在多个 Fragment 中共享数据,我们应该使用 ViewModel()
类。
class SharedViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
fun setData(data: String) {
_data.value = data
}
}
我们可以使用 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,我们可以将应用程序的代码变得更加简洁和可读,减少了重复代码,并且可以确保数据的一致性。