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,也可以拿到同一个对象。
参考¶
作者: rustfisher.com | rf.cs@foxmail.com
示例: AndroidTutorial Gitee, Tutorial Github
本文链接: https://www.an.rustfisher.com/android/jetpack/viewModel/act-frag-use-one-vm/
一家之言,仅当抛砖引玉。如有错漏,还请指出。如果喜欢本站的内容,还请支持作者。也可点击1次下方的链接(链接内容与本站无关),谢谢支持服务器