java.lang.RuntimeException:使用 EditText(数字)启动 Fragment 时无法调用观察者方法双向数据绑定

java.lang.RuntimeException: Failed to call observer method when starting Fragment with EditText (number) Two way databinding

我正在尝试将 MutableLiveData<Int> 绑定到 EditText 元素。我已经实现了绑定适配器,但是当我启动 Activity 时出现错误:java.lang.RuntimeException: Failed to call observer method

感谢您的帮助。

代码:

ViewModel

val serverPort = MutableLiveData<Int>(9330)

XML

    <data>
        <variable
            name="vm"
            type="...LoginViewModel" />
    </data>
    <com.google.android.material.textfield.TextInputEditText
                        android:layout_width="match_parent"
                        android:layout_height="50dp"
                        android:layout_gravity="center"
                        android:inputType="number"
                        android:text="@={vm.serverPort}" />

适配器

    object Converter {


    @BindingConversion
    @JvmStatic
    fun intToStr(value: Int?): String? {
        return value.toString()
    }

    @InverseBindingAdapter(attribute = "android:text")
    @JvmStatic
    fun captureIntValue(view: EditText?): Int? {
        var value: Long = 0
        try {
            value = view!!.text.toString().toInt().toLong()
        } catch (e: NumberFormatException) {
            e.printStackTrace()
        }
        return value.toInt()
    }

您必须尝试使用​​字符串值来设置 android:text

 <TextView
      android:layout_width="match_parent"
      android:layout_height="50dp"
      android:layout_gravity="center"
      android:inputType="number"
      android:text="@{String.valueOf(vm.serverPort)}" />

如果您使用数据绑定:双向转换。 这有点困难,因为没有静态方法的逆过程,当然也没有任意字符串格式的转换。

字符串到基本类型的转换非常常见,可以使用带有双向数据绑定表达式的字符串连接语法来完成,但只能使用空字符串:

<EditText android:text="@={`` + vm.serverPort}" .../>

我还建议您参考此 page 以了解更多信息。