android - 使用自定义转换器的两种方式数据绑定(bind)

标签 android android-databinding android-architecture-components android-viewmodel

我想将数据绑定(bind)与 View 模型一起使用,如 here 所述

所以这里是摘录:

布局:

    <data class="FragmentEditPersonDataBinding">
    <import type="com.unludo.interview.persons.edit.Converter"/>

    <variable
        name="viewmodel"
        type="com.unludo.interview.persons.edit.PersonEditViewModel" />
   [...]
                 <EditText
                android:id="@+id/editBirthday"
                android:inputType="date"
                android:text="@={Converter.dateToString(viewmodel.birthday)}"

转换器:
object Converter {
    @InverseMethod("stringToDate")
    @JvmStatic
    fun dateToString(
            view: EditText, oldValue: String,
            value: Date
    ): String {
        val sdf = SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE)

        return sdf.format(value)
    }

    @JvmStatic   
    fun stringToDate(
            view: EditText, oldValue: String,
            value: String
    ): Date {
        val sdf = SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE)

        return sdf.parse(value)
    }
}

View 模型:
class PersonEditViewModel {
    var birthday: Date = GregorianCalendar(1993, 5, 19).time
    ...

现在我在构建时收到此错误:
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: 
    Found data binding errors.
****/ data binding error ****msg:cannot find method dateToString(java.util.Date) 
    in class com.unludo.interview.persons.edit.Converter 
[...]
 - 134:78 ****\ data binding error ****

我正在使用最新的数据绑定(bind) alpha,所以我想知道 lib 中是否存在错误。

谢谢任何帮助!

- - 更新

如果我这样编写转换器,那么它可以编译,但这与文档不对应。知道为什么吗?
object Converter {

    @InverseMethod("stringToDate")
    @JvmStatic
    fun dateToString(
            value: Date
    ): String {
        val sdf = SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE)

        return sdf.format(value)
    }
    @JvmStatic
    fun stringToDate(
            value: String
    ): Date {
        val sdf = SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE)

        return sdf.parse(value)
    }
}

最佳答案

有点老线程,但我也一直在努力解决双向数据绑定(bind)问题,所以对于任何需要这个问题的答案的人来说,问题是 Unlundo 以记录的方式制作了他们的转换器,那里有一个 View ,而且旧的,和一个新的值(value)。但是,这方面的文档不是很清楚。

类型转换器中的参数也必须存在于布局文件中。对于布局中的原始绑定(bind),android:text="@={Converter.dateToString(viewmodel.birthday)}" ,只有一个参数 - viewmodel.birthday ,我们假设它是一个日期。因此,我们的类型转换器和逆变器只得到 1 个参数。

如果您为多个绑定(bind)重复使用相同的转换器并希望能够查看用户更改的 View ,您可以通过在布局中使用 View 的 ID 将 View 作为参数传递。这将传递生日和用户正在编辑的 View :

                <EditText
                android:id="@+id/editBirthday"
                android:inputType="date"
                android:text="@={Converter.dateToString(edtBirthday, viewmodel.birthday)}"

这也意味着您的类型转换器和反向转换器都需要在 EditText 的开头添加一个额外的参数。该库似乎足够聪明,可以正确获取 View 类型,而不仅仅是给你一个 View至少作为你的论据。

此外,如果您在转换器仅向字符串方向触发时遇到困难,请确保您实际设置了绑定(bind)变量。如果布局绑定(bind)的变量是null ,它将默认值转换为显示,但它不能绑定(bind)任何东西

关于android - 使用自定义转换器的两种方式数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55536577/

相关文章:

java - 如何在 Android Studio 中使用 com.google.android.collect.list

android - 用于 React Native Android 的 XMPP 库

java - 数据绑定(bind)插件使用旧版本的支持库

android - Dao 方法返回 List<String> 而我需要一个 Map<String,Integer>

Java Android 增强现实应用图像坐标

android - Android 数据绑定(bind)的 Kotlin 问题

android - RecyclerView adapterPosition 已弃用,Gradle 抛出错误,因为找不到访问器 bindingAdapterPosition

android - 如何转换 PagedList 中的项目?(Android Arch 组件分页库)

android - 如何在 Android 导航组件中管理 BottomNavigationView 后台堆栈

android - 优雅地处理媒体播放器错误