我曾经创建DataBindingAdapter
来在数据绑定中创建自定义xml属性。
object DataBindingAdapter {
@BindingAdapter("android:src")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
在Java中运行良好 。 但不能正常工作 在科特林中。
据我了解,kotlin中的对象类似于Java的静态方法。但是它不适用于数据绑定。
java.lang.IllegalStateException:类FragmentBottomBarBinding中必需的DataBindingComponent为null。一个BindingAdapter在 acr.browser.lightning.utils.DataBindingAdapter不是静态的, 需要使用从DataBindingComponent检索的对象。如果 您不使用带DataBindingComponent的膨胀方法,请使用 DataBindingUtil.setDefaultComponent或使所有BindingAdapter方法 静态的。
答案 0 :(得分:5)
只需在@Jvmstatic
方法上添加 setImageByRes
注释。
object DataBindingAdapter {
@BindingAdapter("android:src")
@JvmStatic
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
按照@Jvmstatic
doc
指定如果此元素是函数,则需要从此元素生成其他静态方法。如果此元素是属性,则应生成其他静态getter / setter方法。
在一个地方声明的简短方法,可从JVM的多种语言使用。如果要从Java调用方法,则应将其声明为@JvmStatic,因为在一个位置添加@JvmStatic批注将使您可以在多个位置省略多个.Companion引用。
答案 1 :(得分:1)
不。 Kotlin中的对象就像单例一样。我认为您不需要将其放在对象中。只需新建一个文件,说BindingAdapters.kt
,您就无需编写任何类或对象关键字。
它应该看起来像这样。没有其他的。如果您需要更多功能,只需将其添加到此功能下方。同样,不需要类关键字或方括号。这将是全局功能。也许您还应该使用ContextCompat
从resource
的上下文中正确获取imageView
。而且,我宁愿使用与 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()}" />