Android MVVM UI 控制

Android MVVM UI control

我在 Android 上开始使用 LiveData 学习 MVVM。我认为显示和更新基本数据对我来说很清楚。我努力寻找最佳实践的主题是控制 UI.

假设我有一个基本的 UI,例如一个表格。它有几个 EditTextViews 来输入数据。最后它还有一个开关。如果它是 ON 会显示更多的 EditTextViews 来填充。当它是 OFF 当然它们就消失了。

我的问题是在哪里实现这个逻辑?

  1. 在Activity/Fragment代码中?然后业务逻辑将涉及到 MVVM 的 VIEW 部分(我认为这不是很好)。

  2. 在 ViewModel 中?然后业务逻辑将存在于,比方说,数据缓存。这样我就必须在 ViewModel 中创建一堆 boolean getter 来计算单独的 View 可见性的值。然后在我的 Activity 订阅块中更改 LiveData 我需要读取所有这些值并逐一设置视图的可见性。

  3. 在一个单独的Service/Helper/Utilclass?这将是与 #2 相同的解决方案,只是从 ViewModel 中提取的逻辑。

此处的最佳做法是什么?不过,用户输入验证的主题也可以提出同样的问题(我猜有很多这样的领域)。

我会采用第二种方法,但实现方式略有不同(使用 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.

您可以将您的布局订阅到视图模型(使用数据绑定),而不是这样做,类似于:
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>

然后在布局本身中使用基于对不带 getter 的视图模型的引用设置可见性

app:isGone="@{!viewModel.isUnderAge}"

android:visibility="@{viewModel.isUnderAge?  View.VISIBLE : View.INVISIBLE}"