在https://developer.android.com/topic/libraries/data-binding/two-way#converters之后,
我正在尝试为Android中的双向数据绑定实现数据转换器。
转换器的功能:
给定10位数字的电话号码,请在电话号码中添加国家/地区代码。
XML代码:
<data>
<import type="<package_name>.PhoneNumberStringConverter" />
<variable
name="model"
type="<package_name>.MyViewModel" />
</data>
<androidx.appcompat.widget.AppCompatEditText
android:text="@={PhoneNumberStringConverter.addExtension(model.storeDetailsEntity.storePhoneNumber)}"
... // Other irrelevant attributes are not shown
/>
转换器:
object PhoneNumberStringConverter {
@InverseMethod("addExtension")
@JvmStatic
fun removeExtension(view: EditText, oldValue: String, value: String): String {
return value.substring(3)
}
@JvmStatic
fun addExtension(view: EditText, oldValue: String, value: String): String {
return "+91$value"
}
}
当我在XML中添加转换器时,构建失败。 找不到MyLayoutBindingImpl。绑定类生成问题。
注意:
1.双向数据绑定正在按预期方式工作,问题仅在于转换器。
已经推荐:
Two-way data binding Converter
编辑:
感谢@Hasif Seyd的解决方案。
工作代码:
PhoneNumberStringConverter:
object PhoneNumberStringConverter {
@JvmStatic
fun addExtension(value: String): String {
return "+91$value"
}
@InverseMethod("addExtension")
@JvmStatic
fun removeExtension(value: String): String {
return if (value.length > 3) {
value.substring(3)
} else ""
}
}
XML:
android:text="@={PhoneNumberStringConverter.removeExtension(model.storeDetailsEntity.storePhoneNumber)}"
将addExtension
更改为removeExtension
。
答案 0 :(得分:1)
代码中存在一些问题。由于您使用的是双向绑定转换器, 第一个问题是您尝试直接在xml中调用反向绑定适配器,但是按照我在ur转换器定义中看到的那样,绑定适配器为 removeExtension ,因此您必须直接在xml中进行分配
另一个可能的原因可能是因为不需要参数 view 和 oldValue ,如果您从绑定函数中删除了这两个参数,则代码将被编译成功