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的主要内容,如果未能解决你的问题,请参考以下文章

fragment的数据传递

fragment互相间的数据传递

fragment之间的数据传递

fragment互相间的数据传递

Android - fragment之间数据传递

Android Jetpack - ViewModel