代码之家  ›  专栏  ›  技术社区  ›  Khemraj Sharma

无法在Kotlin中使用BindingAdapter

  •  0
  • Khemraj Sharma  · 技术社区  · 7 年前

    我曾经创造 DataBindingAdapter 用于在数据绑定中创建自定义xml属性。

    object DataBindingAdapter {
        @BindingAdapter("android:src")
        fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
            imageView.setImageResource(resId)
        }
    }
    

    是的 工作良好 . 但不起作用 在科特林

    java.lang.IllegalStateException:在FragmentBottomBarBinding类中,必需的DataBinding组件为空。中的绑定适配器 acr.browser.lightning.utils.DataBindingAdapter不是静态的,并且 你不使用通胀方法获取数据绑定组件,使用 DataBindingUtil.setDefaultComponent或使所有BindingAdapter方法 静态的。

    2 回复  |  直到 6 年前
        1
  •  12
  •   Moinkhan    7 年前

    只需添加 @Jvmstatic setImageByRes

    object DataBindingAdapter {
        @BindingAdapter("android:src")
        @JvmStatic
        fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
            imageView.setImageResource(resId)
        }
    }
    

    根据 @JVM静态 doc

    指定如果此元素是函数,则需要从此元素生成其他静态方法。如果此元素是属性,则应生成其他静态getter/setter方法。

        2
  •  4
  •   Kebab Krabby    7 年前

    不。kotlin中的对象与singleton相同。我想你不需要把它放在物体上。只是做一个新文件 BindingAdapters.kt

    应该是这样的。没别的了。如果你需要更多的功能,只需在下面添加它。同样,不需要类关键字或括号。它将是全球性的功能。也许你也应该用 ContextCompat 为了得到 resource 与上下文匹配 imageView . 我宁愿用不同的名字 安卓:src

    @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()}" />