Android 架构组件 ViewModel 上下文问题

标签 android android-fragments android-architecture-components

我正在尝试在 Android 中使用新的架构组件,到目前为止它运行良好。但是,我遇到了架构问题。

我有一个 MainActivity,它承载了一堆 fragment ,ABC。到目前为止,每次我需要我的 ViewModel (VM) 时,我都会在 MainActivity 的上下文中获取它(如下所示:MyViewModel vm = ViewModelProviders.of(getActivity()).get(MyViewModel.类);)。现在考虑一下:

  • fragment C 让用户选择一些值,并将其写入 VM
  • fragment A 使用 fragment C 让用户选择值,然后 A 直接从 VM< 读取值 并将其显示在其 UI 中。
  • fragment B 使用与 fragment A 相同的方法。

问题是,因为 VM 总是在 MainActivity 的上下文中,如果在 之前使用了 fragment A >B,该值仍然可用,B 将显示一些旧数据。

我看到的最明显的解决方案是分别在 fragment AB 的上下文中创建VM。但是后来我不知道如何让 fragment C 访问那些 VM

我也可以在 fragment C 的上下文中创建 VM,但这需要 fragment AB 来创建 C 的实例,我认为这不是一个好的解决方案。

第三种解决方案是保留当前方法并在适当的时候清除 VM 中的数据,但我认为这也很困惑。

解决这个问题最好的方法是什么?

最佳答案

您可以在 VM 中进行映射,并将 AB 的值存储在不同的键下。

因此,当 A 启动 C 时,它会将其 A_key 作为参数传递。当用户在 C 中选择一个值时,它会使用 A_key 作为键存储在 VM 的映射中。当 A 检查一个值是否可用时,它只检查为 A_key 存储的值。

对于 BB_key 也是如此。

关于Android 架构组件 ViewModel 上下文问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46151703/

相关文章:

android - 如何从 Android MVVM 架构中的 LiveData 列表中获取第一个或(任何)元素?

Android 架构组件 ViewModel - 如何在测试 Activity 上模拟 ViewModel?

android - 正确使用 Intent 标志

android - 使用十六进制值/ColorDrawable 以编程方式设置按钮的 setBackgroundTintList

java - Android Studio 中的 OnClickListener

android - Parcelable with arraylist<string> 将值从 Activity 传递到 fragment android

Android - 在 fragment 中使用 Setter 与传递 Bundle

java - 以编程方式添加 TextView 时 NestedScrollView 不滚动

java - 方法不会覆盖其父类(super class)中的方法

java - 此 NavController 不知道操作