我曾经创建
DataBindingAdapter
用于在数据绑定中创建自定义 xml 属性。
object DataBindingAdapter {
@BindingAdapter("android:src")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
imageView.setImageResource(resId)
}
}
它在 Java 中运行良好。 但无法工作 在 kotlin 。
据我了解,kotlin 中的对象类似于 Java 的静态方法。但它不适用于数据绑定。
java.lang.IllegalStateException:类 FragmentBottomBarBinding 中必需的 DataBindingComponent 为 null。中的 BindingAdapter acr.browser.lightning.utils.DataBindingAdapter 不是静态的, 需要一个从 DataBindingComponent 检索的对象来使用。如果 您不使用采用 DataBindingComponent 的通货膨胀方法,请使用 DataBindingUtil.setDefaultComponent 或创建所有 BindingAdapter 方法 静态。
@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 引用。
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()}" />