首页 > 解决方案 > 用于双向数据绑定的三元运算符

问题描述

我在可观察字段上使用三元运算符将文本设置为 xml 中的 textview。但它在编译时给了我以下错误。

****/ 数据绑定错误 ****msg: 表达式 ((vmEnteredAmountGetJavaLangString0) ? ("") : (vmEnteredAmountGet)) 不能反转:三元运算符的条件必须是常量:android.databinding.tool。 writer.KCode@1a6539af

下面是我的代码:

<EditText
                android:id="@+id/txtAmount"
                style="@style/AmountText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text='@={vm.enteredAmount.get()=="0"?"":vm.enteredAmount}'
                app:decimalLen='@{6}' /> 

任何帮助将不胜感激。谢谢。

标签: android-databindingtwo-way-binding

解决方案


我也有这个问题,我认为三元运算不能很好地使用 two-way DataBinding。我有以下解决方案。

方法1 | 适用于所有EditText

object DataBindingUtil {        //Kotlin singleton class
    @BindingAdapter("android:text")
    @JvmStatic
    fun setText(editText: EditText, text: String?) {
        if (text == "0" || text == "0.0") editText.setText("") else editText.setText(text)
    }
}

方法二 | 适用于选定EditText

object DataBindingUtil {
    @BindingAdapter("emptyIfZeroText")        //use this instead "android:text"
    @JvmStatic
    fun setText(editText: EditText, text: String?) {
        if (text == "0" || text == "0.0") editText.setText("") else editText.setText(text)
    }

    @InverseBindingAdapter(attribute = "emptyIfZeroText", event = "android:textAttrChanged")
    @JvmStatic
    fun getText(editText: EditText) = editText.text.toString()
}

适用于您的EditTextapp:emptyIfZeroText="@={`` + viewModel.currentStudent.gpa}"


推荐阅读