在 Kotlin 中无法使用 BindingAdapter

问题描述 投票:0回答:3

我曾经创建

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 方法 静态。

android kotlin android-databinding
3个回答
27
投票
只需在

@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 引用。


7
投票
不。 kotlin 中的对象与单例相同。我认为你不需要把它放在 Object.只需创建新文件,让我们说

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

0
投票
就我而言,原因是我应该将 DataBinding setter 方法放在类之外

© www.soinside.com 2019 - 2024. All rights reserved.