0

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.双向数据绑定按预期工作,问题仅与转换器有关。

已参考:
双向数据绑定转换器

编辑:

感谢@Hasif Seyd 的解决方案。

工作代码:

电话号码字符串转换器:

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

4

1 回答 1

1

代码中有一些问题。由于您使用的是双向绑定转换器,所以第一个问题是您尝试直接在 xml 中调用反向绑定适配器,但是根据我在您的转换器定义中看到的,绑定适配器是removeExtension,所以您必须在直接xml。

另一个可能的原因可能是因为有参数viewoldValue,它们不是必需的,如果您从绑定函数中删除这两个参数,您的代码将成功编译

于 2020-06-13T14:51:59.963 回答