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 以了解更多信息。
我正在尝试将 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 以了解更多信息。