Android数据绑定:如何获取kotlin枚举类的字段值?

Posted

技术标签:

【中文标题】Android数据绑定:如何获取kotlin枚举类的字段值?【英文标题】:Android Databinding: how to get field value of kotlin enum class? 【发布时间】:2019-11-14 04:49:17 【问题描述】:

我有一个包含两个字段的枚举类:

enum class MyEnum(val text1: String, val text2: String) 
    A("a1", "a2"),
    B("b1", "b2")

我想将 XML 中的字段值与数据绑定一起使用。我的 ViewModel 提供了一个 ObservableField<MyEnum>,它应该通过数据绑定在 XML 中使用:

class MyViewModel() : ViewModel() 
    val myEnum = ObservableField<MyEnum>(MyEnum.A)

我尝试读取 XML 中的字段值

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="com.example.MyEnum" />

        <variable
            name="vm"
            type="com.example.MyViewModel" />
    </data>

    <FrameLayout
        android:layout_
        android:layout_>

        <TextView
            android:text="@vm.myEnum.text1"
            android:layout_
            android:layout_/>

    </FrameLayout>
</layout>

但我得到以下异常: 找不到带有参数字符串的属性“文本”的设置器

【问题讨论】:

你确定你没有使用@=而不是@作为数据绑定表达式吗? @CommonsWare 是的,刚刚再次检查:我使用@ 语法 这很奇怪,因为我不知道为什么在这种情况下数据绑定需要一个 setter。 这篇文章中的错字“andoid:text”是吗? 是的,这只是帖子中的错字 【参考方案1】:

迟到了,但你试过用BindingAdapter

@JvmStatic
@BindingAdapter("yourTitleText")
fun fetchYourTitleText(view: TextView, type: MyEnum) 
    view.apply 
        text = when (type) 
            MyEnum.A -> "Your value for A"
            MyEnum.B -> "Your value for B"
        
    

xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="com.example.MyEnum" />
        <variable
            name="vm"
            type="com.example.MyViewModel" />
    </data>

    <FrameLayout
        android:layout_
        android:layout_>

        <TextView
            app:yourTitleText="@vm.myEnum"
            android:layout_
            android:layout_/>

    </FrameLayout>
</layout>

【讨论】:

以上是关于Android数据绑定:如何获取kotlin枚举类的字段值?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 初学者枚举类-密封类-数据类-继承

Kotlin-android:未解决的参考数据绑定

如何在 android 中获取 XML 响应字符串以及 Kotlin 数据模型?

Android 数据绑定库 vs Kotlin Android 扩展

Kotlin学习之枚举类

Android-Kotlin-枚举enum