不能在 Kotlin 中使用 BindingAdapter
Can not use BindingAdapter in Kotlin
我曾经创建 DataBindingAdapter
用于在数据绑定中创建自定义 xml 属性。
object DataBindingAdapter {
@BindingAdapter("android:src")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
在Java中运作良好。 但不工作 在 kotlin 中。
据我了解,kotlin 中的对象类似于 Java 的静态方法。但它在数据绑定中不起作用。
java.lang.IllegalStateException: Required DataBindingComponent is null in class FragmentBottomBarBinding. A BindingAdapter in
acr.browser.lightning.utils.DataBindingAdapter is not static and
requires an object to use, retrieved from the DataBindingComponent. If
you don't use an inflation method taking a DataBindingComponent, use
DataBindingUtil.setDefaultComponent or make all BindingAdapter methods
static.
没有。 kotlin 中的对象与单例相同。我认为你不需要把它放在对象中。只需创建新文件就可以说 BindingAdapters.kt
而你不需要写任何 class 或对象关键字。
它应该是这样的。没有其他的。如果您需要更多功能,只需将其添加到此功能下方即可。同样不需要 class 关键字或括号。这将是全局函数。也许你还应该使用 ContextCompat
从 imageView
的上下文中正确获取 resource
。我宁愿以不同于 android:src 的方式命名它。 imageResBinder
怎么样
@BindingAdapter("imageResBinder")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
然后在您的 .xml
文件中
<android.support.v7.widget.AppCompatImageView
style="@style/Image.SomeImageStyle"
app:imageResBinder="@{viewModel.getImageRes()}" />
只需在 setImageByRes
方法上添加 @Jvmstatic
注释。
object DataBindingAdapter {
@BindingAdapter("android:src")
@JvmStatic
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
根据 @Jvmstatic
doc
Specifies that an additional static method needs to be generated from this element if it's a function. If this element is a property, additional static getter/setter methods should be generated.
简而言之,在一个地方声明并从 JVM 的多种语言中使用的方法。如果您从 Java 调用一个方法,那么您应该将其声明为 @JvmStatic,因为在一个地方添加 @JvmStatic 注释将允许您在多个地方省略多个 .Companion 引用。
我曾经创建 DataBindingAdapter
用于在数据绑定中创建自定义 xml 属性。
object DataBindingAdapter {
@BindingAdapter("android:src")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
在Java中运作良好。 但不工作 在 kotlin 中。
据我了解,kotlin 中的对象类似于 Java 的静态方法。但它在数据绑定中不起作用。
java.lang.IllegalStateException: Required DataBindingComponent is null in class FragmentBottomBarBinding. A BindingAdapter in acr.browser.lightning.utils.DataBindingAdapter is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static.
没有。 kotlin 中的对象与单例相同。我认为你不需要把它放在对象中。只需创建新文件就可以说 BindingAdapters.kt
而你不需要写任何 class 或对象关键字。
它应该是这样的。没有其他的。如果您需要更多功能,只需将其添加到此功能下方即可。同样不需要 class 关键字或括号。这将是全局函数。也许你还应该使用 ContextCompat
从 imageView
的上下文中正确获取 resource
。我宁愿以不同于 android:src 的方式命名它。 imageResBinder
@BindingAdapter("imageResBinder")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
然后在您的 .xml
文件中
<android.support.v7.widget.AppCompatImageView
style="@style/Image.SomeImageStyle"
app:imageResBinder="@{viewModel.getImageRes()}" />
只需在 setImageByRes
方法上添加 @Jvmstatic
注释。
object DataBindingAdapter {
@BindingAdapter("android:src")
@JvmStatic
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
根据 @Jvmstatic
doc
Specifies that an additional static method needs to be generated from this element if it's a function. If this element is a property, additional static getter/setter methods should be generated.
简而言之,在一个地方声明并从 JVM 的多种语言中使用的方法。如果您从 Java 调用一个方法,那么您应该将其声明为 @JvmStatic,因为在一个地方添加 @JvmStatic 注释将允许您在多个地方省略多个 .Companion 引用。