![2be9a3e4844e4f87165f57f610cd380f.png](https://img-blog.csdnimg.cn/img_convert/2be9a3e4844e4f87165f57f610cd380f.png)
在前面的文章中,我们已经知道,ViewModel能够将数据从Activity中剥离出来。只要Activity不被销毁,ViewModel会一直存在,并且独立于Activity的配置变化,即旋转屏幕导致的Activity重建,不会影响到ViewModel。
Fragment可以看作是Activity的子页面,即,一个Activity中可以包含多个Fragment,这些Fragment彼此独立,但是又都属于同一个Activity。
基于这些组件的特性,我们可以巧妙地利用ViewModel和LiveData,实现同一个Activity中的不同Fragment间通信。
![7fb9496d8a5d135f7e8ab46321d3f10f.png](https://img-blog.csdnimg.cn/img_convert/7fb9496d8a5d135f7e8ab46321d3f10f.png)
1.定义ViewModel及LiveData。
public
2.为了方便演示,我们将两个Fragment等比例放置在Activity的layout中,你也可以放置在不同的layout中,然后通过FragmentManager进行切换,只要保证这两个Fragment都属于同一个Fragment即可。
<?xml version="1.0" encoding="utf-8"?>
3.编写Fragment的代码,实现具体的通信。这里以OneFragment为例,TwoFragment也是类似的代码。
public
4.在Fragment的布局文件中放置一个SeekBar控件。
<?xml version="1.0" encoding="utf-8"?>
5.运行Activity查看程序执行效果。
![f0cbeb57a0cb1be560fc8ad4640154cc.gif](https://img-blog.csdnimg.cn/img_convert/f0cbeb57a0cb1be560fc8ad4640154cc.gif)
可以看到,无论是滑动OneFragment还是TwoFragment中的SeekBar,另外一个Fragment中的SeekBar也会跟着滑动。滑动SeekBar时,通过LiveData.setValue(),修改了ViewModel中LiveData包装的数据(progress字段)。由于Fragment通过LiveData.observe()方法,监听了数据的变化,所以progress字段被修改后,Fragment能够第一事件收到通知,进而更新UI。这就是利用ViewMode和LiveData实现Fragment间通信的原理。另外,从演示图中,我们还能看到,屏幕旋转后SeekBar的进度与旋转前保持一直,数据并未丢失,这也是ViewModel带来的好处之一。