问题标签 [android-viewmodel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5867 浏览

android - 在 MVVM 架构中从 ViewModel 启动 Activity 的最佳方法

我在应用程序中关注 MMVM 架构,一切正常,直到我使用以下代码从 ViewModel 启动活动时崩溃。方法是使用数据绑定从 XML 调用并view作为参数传递的,并且getApplication()AndroidViewModel类中的方法。

我相信这是因为我没有使用 NEW_TASK 标志,因为我在 Activity 类之外开始活动。

现在有以下我能想到的解决方案,但从架构的角度来看,我不确定哪一个是最好的。

1. ViewModel 带有一个方法,该方法Activity作为参数并从片段中调用该方法

现在在片段中添加一个类似这样的监听器

2. 为意图添加一个新任务标志并将其保存在 ViewModel 本身中

3.从fragment本身启动Activity

我相信所有这些方法都可以正常工作,但要记住一个问题

是否可以在 Fragment 中单独设置侦听器以使用绑定的 ViewModels 从视图 xml 调用方法?

我不确定第二种方法是否仍会使某些操作系统中的应用程序崩溃。

从架构的角度和单元测试的角度来看,哪一种是最好的方法?

0 投票
1 回答
354 浏览

android - Not able to get the LifeCycle ViewModel Class Using ViewModelProvider

I am trying to get the ViewModel Class for the specific fragment. But ViewModelProvider.of(this).get(UserListViewModel.class) does not work for me. Extending my Fragment from "android.support.v4.app.Fragment", but still it does not work. Here is the code

0 投票
0 回答
84 浏览

android - ViewModel 在返回活动后清除

我有一个活动 A 和活动 B,当从 A 启动活动 B 时,然后在按下后退按钮活动 A 变得可见后将屏幕方向更改为横向,但 ViewModel 清除已烧毁。什么绝招?

0 投票
4 回答
4192 浏览

android - Android ViewModel 无法在片段更改中存活

我一直在尝试使用 viewmodel 和 livedata 在片段之间共享信息。

但是当我从第一个片段更改为另一个片段时,我的视图模型似乎被重新初始化,使我丢失了所有以前存储的数据。

我在片段中以相同的方式获得了两次视图模型:

这就是我在活动中替换碎片的方式(我想问题一定来自碎片生命周期,但我不知道错误在哪里:/)

当我需要一个片段时,我调用backStackFragment()删除当前片段然后我调用showFragment(MyFragment.newInstance());

该片段是AndroidStudio生成的片段

谢谢你的帮助,

诚挚的,马修

0 投票
4 回答
23924 浏览

android - 具有多个参数的 MediatorLiveData 或 switchMap 转换

Transformations.switchMap在我的 ViewModel 中使用,所以LiveData在我的片段中观察到的我的集合会对code参数的变化做出反应。

这完美地工作:

问题

我现在需要另一个参数(nbDays在上面的代码中注释),这样我的LiveData对象对两个参数更改(codenbDays)做出反应。

如何链接转换?

一些阅读将我指向MediatorLiveData,但它并没有解决我的问题(仍然需要使用 2 个参数调用单个 DB 函数,我不需要合并 2 个 liveDatas)。

所以我尝试了这个而不是switchMapbutcode并且nbDays总是为空。

一种解决方案是将对象作为单个参数传递,我很确定有一个简单的解决方案。

0 投票
1 回答
1442 浏览

android - 如何在屏幕旋转方面连接 View 和 ViewModel?

ViewModel 的一个承诺是,它可以在屏幕旋转等情况下幸存下来。我仍然试图弄清楚如何在实践中组织它。

在模型的某些事件上,视图应该更新。有两个主要选项:

  1. ViewModel 更新视图。
  2. View 观察 ViewModel 并自行更新。

在第一种情况下,ViewModel 需要一个指向 View 的链接。我可以将 View 注入到 ViewModel 中,但我的感觉是将 VieModel 注入到 View 中会更好。

加入他们的更好的风格是什么?

然后在旋转之后再次调用 onCreate() 方法,再次触发 ViewModel 的初始化。我需要检查这一点,否则我有危险将听众注册到实际模型两次和三次以及类似问题。我什至可能需要先清理与旧视图的关系。

这种检查感觉有点不干净。如果这是一种标准做法,我希望在 ViewModel 中有一个专用的 API。没有我有走错路的感觉。

以干净的标准方式处理这个问题的好模式是什么?

0 投票
2 回答
2265 浏览

android - Android ViewModel:我应该像官方示例中那样从 LiveData“借用”observe() 方法吗?

使用 ViewModel 时,View 会观察 ViewModel。它必须注册为观察者。在 Google 的官方教程中,此注册被委托给对象的observe()方法LiveData

该方法getUsers()返回LiveData对象本身。它的observe()方法用于注册观察者。视图不观察ViewModel它的实现,但它的一部分。

现在这是最佳实践,当使用对象时ViewModels不是观察自己而是观察它们的部分实现LiveData?或者这是低质量的介绍?

0 投票
1 回答
655 浏览

android - 在Android中,如果我使用绑定,如何应用ClickableSpan?

我知道如果没有应用绑定,那么我可以使用Textview.setText(ClickableSpan)spannig 效果来使部分文本可点击。但是,我的应用程序使用了绑定,并且 textview 的文本被绑定到 xmlandroid:text="@{model.certainString}"中的 ViewModel 和我声明的 ViewModel 中String certainString = "",在这种情况下,我如何在 ViewModel 中应用跨越呢?

0 投票
2 回答
3897 浏览

android - 来自 Transformation 的数据绑定 LiveData - Android Kotlin

我正在学习 kotlin 和 android 架构组件。我有一个谷歌地图上的地图切换按钮的简单用例。

我想使用数据绑定将地图切换按钮标签绑定到我的 ViewModel 中的 MutableLiveData 字段。

我通过 Activity 中的 onCreate 方法在 MapViewModel 中设置 mapType val。如果我理解正确,这应该会触发 mapLabel val 由于使用 Transformations.map 而发生变化。

它不工作......为什么?

这是我的版本:

  • 安卓工作室 3.2 金丝雀 4
  • kotlin_version = '1.2.21'
  • 支持=“27.1.0”
  • arch_core = "1.1.0"
  • 数据绑定 = "3.2.0-alpha04"

地图视图模型.kt

活动地图.xml

MapsActivity.kt

我已经使用 MutableLiveData 对象测试了绑定,我在该对象中设置了活动中的字符串,它工作正常。问题似乎出在 Transformations.map 上——我是不是理解错了?

此外,在调试时,我看到我的 ViewModel 中的 mapType val 没有观察者(不确定这是对还是错,只是很有趣)

0 投票
1 回答
1377 浏览

mvvm - androidViewModel + recyclerview 滚动跳转模型更新(MVVM)

我对 recyclerview + mvvm 实现有一个非常具体的问题。

当我ListItem在recyclerview 中选择a 时,点击我的viewmodel 类,该类将“isselected”标志应用于recyclerview (间接)观察到ListItem的类。MutableLiveData这会导致 mainactivity 中的观察者更新List<ListItem>由 recyclerview 显示的整体。

结果是,每当我在 recyclerview 中选择一个项目时,recyclerview 都会向上滚动,(可能)因为整个列表都已更新,并且它将更新后的列表视为一个全新的列表。

如何在干净的代码中调整这种行为,最好是 mvvm 模式。

(也许是记录点击位置的解决方案,如果该位置存在,新列表会立即“滚动”到该位置。但如果可能的话,我不知道如何实现。)