跳转至

Activity与Fragment用同一个ViewModel

更新日期 2022-5-17
  • 2022-5-17 增加参考
  • 2021-6-26 创建文档

它们用的vm是同一个对象。Activity与Fragment中都用ViewModelProvider来提供ViewModel对象。

能用同一个vm,我们就可以方便的实现Activity与Fragment通信和Fragment之间的通信。

ViewModel

定义AnimCollectVm

public class AnimCollectVm extends AndroidViewModel {

    public AnimCollectVm(@NonNull Application application) {
        super(application);
    }
    // 其他方法...
}

Activity

onCreate方法中,调用new ViewModelProvider(this).get(AnimCollectVm.class)获取对象mAnimVm

public class AnimCollectAct extends AppCompatActivity {
    private AnimCollectActBinding mBinding;
    private AnimCollectVm mAnimVm;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.anim_collect_act);
        mAnimVm = new ViewModelProvider(this).get(AnimCollectVm.class);
        mBinding.setVm(mAnimVm);
        // ...
    }

Fragment

onCreate方法中,用new ViewModelProvider(getActivity()).get(AnimCollectVm.class)获取对象mAnimVm

public class AbsAniFrag extends Fragment {
    protected AnimCollectVm mAnimVm;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAnimVm = new ViewModelProvider(getActivity()).get(AnimCollectVm.class);
        Log.d(TAG, "onCreate: frag vm-" + mAnimVm.hashCode());
        // ...
    }
}

运行验证

Activity与Fragment获取到的是同一个vm对象。 如果有多个Fragment,也可以拿到同一个对象。

参考

本站说明

一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~

📖AndroidTutorial 📚AndroidTutorial 🙋反馈问题 🔥最近更新 🍪投喂作者

Ads