我试图围绕新的Android架构组件,特别是ViewModel。
我的印象是片段不应该知道它所拥有的Activity或Fragment,因此它可以在应用程序的不同上下文中使用。这些示例似乎与此相矛盾,方法是直接在Fragment中声明ViewModel范围,而不是片段所有者:
viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);
我希望能够在Master / Detail配置中使用此Fragment,其中两者共享相同的状态(即ViewModel实例),以及ViewPager内部,其中所有Fragments都需要单独的状态(即单独的ViewModel实例) )。我希望Fragment所有者能够决定范围,这种方法似乎不支持。
我想出的一种解决方法是,可以选择传入已配置的ViewModelProvider,以便在必要时显式扩展ViewModel的范围(例如,在Master / Detail配置中),并默认使用单独的ViewModel:
final ViewModelProvider viewModelProvider;
if (viewModelProviderOverride != null) {
viewModelProvider = viewModelProviderOverride;
} else {
viewModelProvider = ViewModelProviders.of(this);
}
viewModel = viewModelProvider.get(SomeViewModel.class);
这样,所有者可以决定是否多个片段将共享其状态。我还没有完全想到这一点,但它似乎有点可疑,因为在文档中似乎没有任何接近它的东西。我觉得我错过了一些明显的东西。
答案 0 :(得分:1)
说viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class);
表示您希望将ViewModel
的状态限定为活动。如果您不希望将片段限定为活动范围,则可以调用viewModel = ViewModelProviders.of(this).get(SomeViewModel.class);
。现在你所做的只是if (shareState)
然后调用第一个,如果没有调用第二个。