我有一个名为 SharedViewModel 的 ViewModel:
public class SharedViewModel<T> extends ViewModel {
private final MutableLiveData<T> selected = new MutableLiveData<>();
public void select(T item) {
selected.setValue(item);
}
public LiveData<T> getSelected() {
return selected;
}
}
我已经根据 Google 的 Arch ViewModel 参考页面上的 SharedViewModel 示例实现了它:
一个活动中的两个或多个片段需要相互通信是很常见的。这绝非易事,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起。此外,两个片段都必须处理另一个片段尚未创建或不可见的情况。
我有两个片段,称为 ListFragment
和 DetailFragment
。
到目前为止,我在名为 MasterActivity
的活动中使用了这两个片段,并且一切正常。
我在 ListFragment
中获得了 ViewModel,选择了要在 DetailFragment
上使用它的值。
mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
但是,现在,在某些情况下,我需要将 ListFragment
(不同设备配置的布局)添加到名为 DetailActivity
的不同活动中。有没有办法像上面的例子那样做?
原文由 alexpfx 发布,翻译遵循 CC BY-SA 4.0 许可协议
有点晚了,但您可以使用共享的
ViewModelStore
来完成此操作。片段和活动实现ViewModelStoreOwner
接口。在那些情况下,片段每个实例都有一个存储,活动将它保存在一个静态成员中(我想它可以在配置更改后继续存在)。回到 shared
ViewModelStore
,假设您希望它成为您的 Application 实例。您需要您的应用程序来实施ViewModelStoreOwner
。然后在您知道需要在活动边界之间共享 ViewModel 的情况下,您可以执行类似的操作。
所以现在它将使用应用程序中定义的商店。这样您就可以共享 ViewModel。
很重要。因为在此示例中
ViewModels
存在于您的应用程序实例中,所以当使用它们的片段/活动被销毁时,它们不会被销毁。因此,您必须将它们链接到将使用它们的最后一个片段/活动的生命周期,或者手动销毁它们。