Android MVVM UI 控制
Android MVVM UI control
我在 Android 上开始使用 LiveData 学习 MVVM。我认为显示和更新基本数据对我来说很清楚。我努力寻找最佳实践的主题是控制 UI.
假设我有一个基本的 UI,例如一个表格。它有几个 EditTextViews 来输入数据。最后它还有一个开关。如果它是 ON 会显示更多的 EditTextViews 来填充。当它是 OFF 当然它们就消失了。
我的问题是在哪里实现这个逻辑?
在Activity/Fragment代码中?然后业务逻辑将涉及到 MVVM 的 VIEW 部分(我认为这不是很好)。
在 ViewModel 中?然后业务逻辑将存在于,比方说,数据缓存。这样我就必须在 ViewModel 中创建一堆 boolean
getter 来计算单独的 View 可见性的值。然后在我的 Activity 订阅块中更改 LiveData 我需要读取所有这些值并逐一设置视图的可见性。
在一个单独的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}"
我在 Android 上开始使用 LiveData 学习 MVVM。我认为显示和更新基本数据对我来说很清楚。我努力寻找最佳实践的主题是控制 UI.
假设我有一个基本的 UI,例如一个表格。它有几个 EditTextViews 来输入数据。最后它还有一个开关。如果它是 ON 会显示更多的 EditTextViews 来填充。当它是 OFF 当然它们就消失了。
我的问题是在哪里实现这个逻辑?
在Activity/Fragment代码中?然后业务逻辑将涉及到 MVVM 的 VIEW 部分(我认为这不是很好)。
在 ViewModel 中?然后业务逻辑将存在于,比方说,数据缓存。这样我就必须在 ViewModel 中创建一堆
boolean
getter 来计算单独的 View 可见性的值。然后在我的 Activity 订阅块中更改 LiveData 我需要读取所有这些值并逐一设置视图的可见性。在一个单独的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}"