相关疑难解决方法(0)

在不同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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Google的Arch ViewModel参考页面上基于SharedViewModel示例实现它:

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

活动中的两个或更多个片段需要彼此通信是很常见的.这绝不是微不足道的,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起.而且,两个片段必须处理尚未创建或不可见的其他片段的情况.

我有两个片段,叫做ListFragmentDetailFragment.

到现在为止我用里面称这两个片段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

22
推荐指数
3
解决办法
1万
查看次数

如何将视图模型范围限定为父片段?

所以我正在使用新的导航组件(具有一个活动原则)并使用共享视图模型在每个片段之间进行通信,但是,我有时需要清除视图模型但我找不到清除它的好地方。但是 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

11
推荐指数
5
解决办法
1万
查看次数

Android JetPack的共享ViewModel生命周期

该文件 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

9
推荐指数
1
解决办法
577
查看次数

如何手动清除特定的视图模型?

据我了解,当我们在片段中调用此代码时,我们将从 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 mvvm android-viewmodel

5
推荐指数
1
解决办法
7280
查看次数