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,也可以拿到同一个对象。
参考¶
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~