问题标签 [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.
android - 在 MVVM 架构中从 ViewModel 启动 Activity 的最佳方法
我在应用程序中关注 MMVM 架构,一切正常,直到我使用以下代码从 ViewModel 启动活动时崩溃。方法是使用数据绑定从 XML 调用并view
作为参数传递的,并且getApplication()
是AndroidViewModel
类中的方法。
我相信这是因为我没有使用 NEW_TASK 标志,因为我在 Activity 类之外开始活动。
现在有以下我能想到的解决方案,但从架构的角度来看,我不确定哪一个是最好的。
1. ViewModel 带有一个方法,该方法Activity
作为参数并从片段中调用该方法
现在在片段中添加一个类似这样的监听器
2. 为意图添加一个新任务标志并将其保存在 ViewModel 本身中
3.从fragment本身启动Activity
我相信所有这些方法都可以正常工作,但要记住一个问题
是否可以在 Fragment 中单独设置侦听器以使用绑定的 ViewModels 从视图 xml 调用方法?
我不确定第二种方法是否仍会使某些操作系统中的应用程序崩溃。
从架构的角度和单元测试的角度来看,哪一种是最好的方法?
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
android - ViewModel 在返回活动后清除
我有一个活动 A 和活动 B,当从 A 启动活动 B 时,然后在按下后退按钮活动 A 变得可见后将屏幕方向更改为横向,但 ViewModel 清除已烧毁。什么绝招?
android - Android ViewModel 无法在片段更改中存活
我一直在尝试使用 viewmodel 和 livedata 在片段之间共享信息。
但是当我从第一个片段更改为另一个片段时,我的视图模型似乎被重新初始化,使我丢失了所有以前存储的数据。
我在片段中以相同的方式获得了两次视图模型:
这就是我在活动中替换碎片的方式(我想问题一定来自碎片生命周期,但我不知道错误在哪里:/)
当我需要一个片段时,我调用backStackFragment()
删除当前片段然后我调用showFragment(MyFragment.newInstance());
该片段是AndroidStudio生成的片段
谢谢你的帮助,
诚挚的,马修
android - 具有多个参数的 MediatorLiveData 或 switchMap 转换
我Transformations.switchMap
在我的 ViewModel 中使用,所以LiveData
在我的片段中观察到的我的集合会对code
参数的变化做出反应。
这完美地工作:
问题
我现在需要另一个参数(nbDays
在上面的代码中注释),这样我的LiveData
对象对两个参数更改(code
和nbDays
)做出反应。
如何链接转换?
一些阅读将我指向MediatorLiveData,但它并没有解决我的问题(仍然需要使用 2 个参数调用单个 DB 函数,我不需要合并 2 个 liveDatas)。
所以我尝试了这个而不是switchMap
butcode
并且nbDays
总是为空。
一种解决方案是将对象作为单个参数传递,我很确定有一个简单的解决方案。
android - 如何在屏幕旋转方面连接 View 和 ViewModel?
ViewModel 的一个承诺是,它可以在屏幕旋转等情况下幸存下来。我仍然试图弄清楚如何在实践中组织它。
在模型的某些事件上,视图应该更新。有两个主要选项:
- ViewModel 更新视图。
- View 观察 ViewModel 并自行更新。
在第一种情况下,ViewModel 需要一个指向 View 的链接。我可以将 View 注入到 ViewModel 中,但我的感觉是将 VieModel 注入到 View 中会更好。
加入他们的更好的风格是什么?
然后在旋转之后再次调用 onCreate() 方法,再次触发 ViewModel 的初始化。我需要检查这一点,否则我有危险将听众注册到实际模型两次和三次以及类似问题。我什至可能需要先清理与旧视图的关系。
这种检查感觉有点不干净。如果这是一种标准做法,我希望在 ViewModel 中有一个专用的 API。没有我有走错路的感觉。
以干净的标准方式处理这个问题的好模式是什么?
android - Android ViewModel:我应该像官方示例中那样从 LiveData“借用”observe() 方法吗?
使用 ViewModel 时,View 会观察 ViewModel。它必须注册为观察者。在 Google 的官方教程中,此注册被委托给对象的observe()
方法LiveData
。
该方法getUsers()
返回LiveData
对象本身。它的observe()
方法用于注册观察者。视图不观察ViewModel
它的实现,但它的一部分。
现在这是最佳实践,当使用对象时ViewModels
不是观察自己而是观察它们的部分实现LiveData
?或者这是低质量的介绍?
android - 在Android中,如果我使用绑定,如何应用ClickableSpan?
我知道如果没有应用绑定,那么我可以使用Textview.setText(ClickableSpan)
spannig 效果来使部分文本可点击。但是,我的应用程序使用了绑定,并且 textview 的文本被绑定到 xmlandroid:text="@{model.certainString}"
中的 ViewModel 和我声明的 ViewModel 中String certainString = ""
,在这种情况下,我如何在 ViewModel 中应用跨越呢?
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 没有观察者(不确定这是对还是错,只是很有趣)
mvvm - androidViewModel + recyclerview 滚动跳转模型更新(MVVM)
我对 recyclerview + mvvm 实现有一个非常具体的问题。
当我ListItem
在recyclerview 中选择a 时,点击我的viewmodel 类,该类将“isselected”标志应用于recyclerview (间接)观察到ListItem
的类。MutableLiveData
这会导致 mainactivity 中的观察者更新List<ListItem>
由 recyclerview 显示的整体。
结果是,每当我在 recyclerview 中选择一个项目时,recyclerview 都会向上滚动,(可能)因为整个列表都已更新,并且它将更新后的列表视为一个全新的列表。
如何在干净的代码中调整这种行为,最好是 mvvm 模式。
(也许是记录点击位置的解决方案,如果该位置存在,新列表会立即“滚动”到该位置。但如果可能的话,我不知道如何实现。)