我有一个Activity和4个片段。起初我想为ViewModel的每个片段做一些事情。但情况是这样的,我还需要ViewModel for Activity。我想知道为View创建ViewModel并使用getActivity从片段调用必要的方法是错误的吗?例如,在片段中调用getActivity()。myViewModel.callMethod()?这种方法不会错吗?

分析解答

是的,您可以在片段中使用Activity的ViewModel,但不能像getActivity().myViewModel.callMethod()那样。它应该是这样的

YourViewModel viewModel = ViewModelProviders.of(getActivity()).get(YourViewModel.class);

在片段之间共享数据是一种很好的做法。

谷歌官方文件

这样,当每个片段都获得ViewModelProvider时,它们就会出现   接收相同的SharedViewModel实例,该实例的范围是这个   活动。

这种方法具有以下优点:

  • 活动不需要做任何事情,或者对此有所了解   通讯。
  • 碎片除此之外不需要彼此了解   SharedViewModel合约。如果其中一个片段消失了,那么   另一个像往常一样继续工作。
  • 每个片段都有自己的生命周期,   并且不受另一个生命周期的影响。如果一个片段   替换另一个,UI继续工作没有任何问题。