我有一个名为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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Google的Arch ViewModel参考页面上基于SharedViewModel示例实现它:
活动中的两个或更多个片段需要彼此通信是很常见的.这绝不是微不足道的,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起.而且,两个片段必须处理尚未创建或不可见的其他片段的情况.
我有两个片段,叫做ListFragment和DetailFragment.
到现在为止我用里面称这两个片段MasterActivity.一切都运作良好.
我得到了ViewModel ListFragment,选择了要使用它的值DetailFragment.
mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
Run Code Online (Sandbox Code Playgroud)
但是,现在我需要在某些情况下ListFragment(将不同设备配置的布局)添加到另一个名为的活动中DetailActivity.有没有办法像上面的例子那样做?
android viewmodel android-fragments android-activity android-architecture-lifecycle
所以我正在使用新的导航组件(具有一个活动原则)并使用共享视图模型在每个片段之间进行通信,但是,我有时需要清除视图模型但我找不到清除它的好地方。但是 tbh 我认为与其试图自己清除它,我真的应该允许框架为我做这件事,但这不是因为视图模型是共享的并限定于活动,但我认为我可以将它们限定为一个父片段,我画了一张图来说明我想要做什么。
所以当我从“Child 1 Child a”导航回来时,我只想清除 2 个视图模型,当前视图模型永远不会被清除,试图通过在片段中调用“this”来获取当前的视图模型,而 getParentFragment 在孩子中没有不行,谁能举个例子?
编辑
看起来我已经在做类似的事情,但在我的情况下它不起作用所以我将添加一些代码,这是我如何访问父片段中的第一个视图模型
model = ViewModelProviders.of(this).get(RequestViewModel.class);
Run Code Online (Sandbox Code Playgroud)
然后在子片段中,我正在这样做
requestViewModel = ViewModelProviders.of(getParentFragment()).get(RequestViewModel.class);
Run Code Online (Sandbox Code Playgroud)
但这并没有保留他们之间的数据,他们都附加了观察者
android viewmodel android-fragments android-architecture-navigation
该文件 https://developer.android.com/topic/libraries/architecture/viewmodel#sharing描述了如何在不同的片段之间共享相同的ViewModel。
我的页面有些复杂 单个“活动”应用程序中其中包含容器和选项卡片段。每个此类页面都有自己的ViewModel,应与所有包含的片段共享。
这里的关键技巧是使用Activity而不是Fragment来保存我的ViewModel。
问题是我的活动可以有多个具有自己的模型的页面,并且始终保持特定页面的视图模型是浪费设备资源。
当用户离开页面时,是否有任何方法可以控制ViewModel的生命周期以销毁它?
我想使用容器片段而不是活动:
model = ViewModelProviders.of(getPageContainerFragment()).get(SharedViewModel.class);
Run Code Online (Sandbox Code Playgroud)
但是发现这个想法不是很好,因为所有子片段都应该了解父元素,而这可能不是很好。
是否有其他方法可以正确处理这种情况?
android model-view android-fragments android-architecture-components android-jetpack
据我了解,当我们在片段中调用此代码时,我们将从 Activity ViewModelStore 获得一个视图模型实例:
viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
当fragment结束其生命周期时,该viewmodel的实例将存在于ViewModelStore中,直到activity销毁。ViewModelStore 有一个clear()方法,但它会清除其中的所有视图模型。有什么方法可以清除特定的 ViewModel 吗?
另一个解决方案是将 ViewModel 的范围限定为父片段,但是我们如何通过 ViewModelProviders.of() 初始化另一个片段中的 ViewModel?我应该将片段或视图模型实例传递给下一个片段吗?
android ×4
viewmodel ×2
android-architecture-components ×1
android-architecture-lifecycle ×1
android-architecture-navigation ×1
model-view ×1
mvvm ×1