写一个两个fragment之间通过MVVM通信的例子
时间: 2023-06-25 09:02:02 浏览: 137
有关MVVM的简单例子
好的,以下是一个简单的例子:
首先,我们需要创建两个Fragment:FragmentA 和 FragmentB。
在 FragmentA 中,我们需要定义一个 ViewModel,并且在 ViewModel 中定义一个 LiveData 对象用于传递数据。
FragmentA.kt:
```
class FragmentA : Fragment() {
private lateinit var viewModel: FragmentAViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentABinding.inflate(inflater, container, false)
viewModel = ViewModelProviders.of(this).get(FragmentAViewModel::class.java)
// 设置点击事件,将数据传递到 ViewModel 中
binding.btnSend.setOnClickListener {
viewModel.setData(binding.etInput.text.toString())
}
return binding.root
}
}
```
FragmentAViewModel.kt:
```
class FragmentAViewModel : ViewModel() {
private val data = MutableLiveData<String>()
fun setData(str: String) {
data.value = str
}
fun getData(): LiveData<String> {
return data
}
}
```
在 FragmentB 中,我们需要获取 FragmentAViewModel 中的 LiveData 对象,并且观察数据的变化。
FragmentB.kt:
```
class FragmentB : Fragment() {
private lateinit var viewModel: FragmentAViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentBBinding.inflate(inflater, container, false)
viewModel = ViewModelProviders.of(activity!!).get(FragmentAViewModel::class.java)
// 观察数据的变化
viewModel.getData().observe(this, Observer<String> { data ->
binding.tvOutput.text = data
})
return binding.root
}
}
```
这样,当我们在 FragmentA 中点击按钮时,数据就会被传递到 FragmentAViewModel 中,并且通过 LiveData 对象传递到 FragmentB 中,并且在 FragmentB 中的 TextView 中显示出来。
阅读全文