无法在Kotlin中使用BindingAdapter

时间:2018-08-16 11:10:21

标签: android kotlin android-databinding

我曾经创建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方法   静态的。

2 个答案:

答案 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,您就无需编写任何类或对象关键字。

它应该看起来像这样。没有其他的。如果您需要更多功能,只需将其添加到此功能下方。同样,不需要类关键字或方括号。这将是全局功能。也许您还应该使用ContextCompatresource的上下文中正确获取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()}" />