在不同 Activity 中的片段之间共享 ViewModel

新手上路,请多包涵

我有一个名为 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 示例实现了它:

https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing_data_between_fragments

一个活动中的两个或多个片段需要相互通信是很常见的。这绝非易事,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起。此外,两个片段都必须处理另一个片段尚未创建或不可见的情况。

我有两个片段,称为 ListFragmentDetailFragment

到目前为止,我在名为 MasterActivity 的活动中使用了这两个片段,并且一切正常。

我在 ListFragment 中获得了 ViewModel,选择了要在 DetailFragment 上使用它的值。

 mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

但是,现在,在某些情况下,我需要将 ListFragment (不同设备配置的布局)添加到名为 DetailActivity 的不同活动中。有没有办法像上面的例子那样做?

原文由 alexpfx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

有点晚了,但您可以使用共享的 ViewModelStore 来完成此操作。片段和活动实现 ViewModelStoreOwner 接口。在那些情况下,片段每个实例都有一个存储,活动将它保存在一个静态成员中(我想它可以在配置更改后继续存在)。

回到 shared ViewModelStore ,假设您希望它成为您的 Application 实例。您需要您的应用程序来实施 ViewModelStoreOwner

 class MyApp: Application(), ViewModelStoreOwner {
    private val appViewModelStore: ViewModelStore by lazy {
        ViewModelStore()
    }

    override fun getViewModelStore(): ViewModelStore {
        return appViewModelStore
    }
}

然后在您知道需要在活动边界之间共享 ViewModel 的情况下,您可以执行类似的操作。

 val viewModel = ViewModelProvider(myApp, viewModelFactory).get(CustomViewModel::class.java)

所以现在它将使用应用程序中定义的商店。这样您就可以共享 ViewModel。

很重要。因为在此示例中 ViewModels 存在于您的应用程序实例中,所以当使用它们的片段/活动被销毁时,它们不会被销毁。因此,您必须将它们链接到将使用它们的最后一个片段/活动的生命周期,或者手动销毁它们。

原文由 mikehc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏