Fragment间实时传递数据 - 使用ViewModel
Posted 布里啾啾提不哩多
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment间实时传递数据 - 使用ViewModel相关的知识,希望对你有一定的参考价值。
- Fragment的通信方式,网上搜了那么多方法,基本全都是使用接口回调。如果是两个Fragment需要即时传数据,还需要先在Activity获得f1传过来的数据,再传到f2,相当麻烦。
- 简单方便的方法来自谷歌官方文档:谷歌官方文档,说明看官方文档还是相当有用的,官方文档也有Activity与Fragment间通信,一样的方法,有需要自己去看。
谷歌文档有个坑,关于ViewModelProviders弃用后最新用法:https://blog.csdn.net/weixin_43888181/article/details/109219671
1、创建SharedViewModel类,继承ViewModel,在里面定义一个MutableLiveData类型的变量,Music是我们定义的一个类,用于传递。MutableLiveData文档的解释是:一个可变LiveData。而这个LiveData是一个生命周期数据存储器类,可以遵循如 Activity、Fragment 或 Service的生命周期。定义了两个public方法:setSelectMusic()和 getSelectMusic()。setSelectMusic()通过selectMusic.setValue()方法设置传递的参数。 getSelectMusic()获取到selectMusic。
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Music> selectMusic = new MutableLiveData<Music>();
public void setSelectMusic(Music music){
selectMusic.setValue(music);
}
public LiveData<Music> getSelectMusic() {
return selectMusic;
}
}
2、RightFragment.java中传递:
private SharedViewModel viewModel;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right_fragment, container, false);
viewModel = new ViewModelProvider(
requireActivity(),
new ViewModelProvider.NewInstanceFactory()).get(SharedViewModel.class);
Music music = new Music();
music.setName("陈奕迅 - 淘汰");
//传递参数
viewModel.setSelectMusic(music);
return view;
}
3、LeftFragment.java中接收:
private SharedViewModel viewModel;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(
requireActivity(),
new ViewModelProvider.NewInstanceFactory()).get(SharedViewModel.class);
viewModel.getSelectMusic().observe(this, item -> {
Log.d("RightFragment传过来的数据 ", item.getName());
});
}
Music.java:
public class Music {
public String name; //音乐名
public String singer; //歌手
public long duration; //时长
public String url; //路径
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
以上是关于Fragment间实时传递数据 - 使用ViewModel的主要内容,如果未能解决你的问题,请参考以下文章