我开始在 Android 上使用 LiveData 学习 MVVM。我认为显示和更新基本数据对我来说很清楚。我很难找到最佳实践的主题是控制 UI。
假设我有一个基本的 UI,例如一个表单。它有几个 EditTextViews 来输入数据。最后它还有一个开关。如果是开 显示更多的 EditTextViews 来填充。当它是 时关闭 他们当然走了。
我的问题是在哪里实现这个逻辑?
boolean
ViewModel 中的 getter,用于计算单独 View 可见性的值。然后在 LiveData 更改的订阅 block 中的 Activity 中,我需要读取所有这些值并一一设置 View 的可见性。这里的最佳做法是什么?不过,同样的问题可以提出用户输入验证的主题(我猜这些领域有很多)。
最佳答案
我会采用第二种方法,但实现方式略有不同(使用 DataBinding),灵感来自 Google 的示例 Sunflower 应用程序:
https://github.com/android/sunflower
它应该引入 Jetpack 最佳实践,包括 MVVM。
Then in my Activity in the subscription block for LiveData change I need to read all of these values and set visibility for the views one-by-one.
您可以将布局订阅到 View 模型(使用 DataBinding),而不是这样做,类似于:
https://github.com/android/sunflower/blob/master/app/src/main/res/layout/fragment_plant_detail.xml
<data>
<import type="com.google.samples.apps.sunflower.data.Plant"/>
<variable
name="viewModel"
type="com.google.samples.apps.sunflower.viewmodels.PlantDetailViewModel" />
</data>
然后在布局本身中使用基于对没有 setter/getter 的 View 模型的引用设置可见性app:isGone="@{!viewModel.isUnderAge}"
或者android:visibility="@{viewModel.isUnderAge? View.VISIBLE : View.INVISIBLE}"
关于Android MVVM UI 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63279628/