【发布时间】:2017-06-19 22:51:13
【问题描述】:
我有一个名为 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 的不同活动中。有没有办法类似于上面的例子?
【问题讨论】:
-
你正在与框架作斗争。如果它转到另一个名为 DetailActivity 的活动,则为您的 Detail Activity 提供一个 ViewModel。 ViewModel 不仅仅是“可以比配置更改更持久的魔法对象”。它们是您的视图和模型之间的粘合剂。如果您有不同的活动,您的视图现在不同,因此需要一个新的视图模型。如果您像谷歌期望的那样分离您的关注点,那么有权访问数据的“存储库”可以/将由这些视图模型共享,但它们是不同的实体。
-
如果你要传递给一个新的 Activity,你不应该只用你的对象去
Parcelable吗? -
实现一个接口来监听在你的活动中选择了哪些列表项,包括 ListFragment。然后在 ListFragment 中,在 onAttach 事件中获取接口。使用 findFragmentByTag 将选中的 item 传递给 MasterActivity 中的 DetailFragment 并传递给其他 Activity 中的 DetailActivity。
标签: android android-fragments android-activity viewmodel android-architecture-lifecycle