Android MVVM UI 控件

标签 android mvvm visibility

我开始在 Android 上使用 LiveData 学习 MVVM。我认为显示和更新基本数据对我来说很清楚。我很难找到最佳实践的主题是控制 UI。
假设我有一个基本的 UI,例如一个表单。它有几个 EditTextViews 来输入数据。最后它还有一个开关。如果是显示更多的 EditTextViews 来填充。当它是 时关闭 他们当然走了。
我的问题是在哪里实现这个逻辑?

  • 在 Activity/fragment 代码中?然后业务逻辑将涉及到 MVVM 的 VIEW 部分(我觉得这不是很好)。
  • 在 View 模型中?然后业务逻辑将存在于数据缓存中。这样我就必须创建一堆 boolean ViewModel 中的 getter,用于计算单独 View 可见性的值。然后在 LiveData 更改的订阅 block 中的 Activity 中,我需要读取所有这些值并一一设置 View 的可见性。
  • 在单独的 Service/Helper/Util 类中?这将是与#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.


    您可以将布局订阅到 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/

    相关文章:

    c# - MVVM ComboBox SelectedIndex 与 SelectedItem

    css - 如何使文字隐藏在悬停中

    php - PHP 中类方法的默认可见性

    mvvm - 可移植 View 模型中的MVVM和模态

    android - 安卓模拟器测试账号

    android - 如何从 ViewPager 的 fragment 中更改 Activity 的 View ?

    android - Android 中可能存在哪些安全问题

    ios - 在 tableview 的文本字段中搜索

    带有多个 div 的 Javascript 切换,第一个 div 最初可见

    android - 从 Google 照片提供商选择视频不会提供 mimetype 信息