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;
    }
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值