Skip to content

Activity与Fragment用同一个ViewModel

它们用的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
联系: rf.cs@foxmail.com
博客: rustfisher.com | RustFisher cnblog
示例: AndroidTutorial Gitee, Tutorial Github
链接: https://www.an.rustfisher.com/android/jetpack/viewModel/act-frag-use-one-vm/
一家之言,仅当抛砖引玉。如有错漏,还请指出。