gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:04:14 27 4
gpt4 key购买 nike

我想将数据绑定(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com