gpt4 book ai didi

Kotlin 自定义属性数据绑定(bind)

转载 作者:IT老高 更新时间:2023-10-28 13:26:24 24 4
gpt4 key购买 nike

我正在尝试使用 Android DataBinding Library 设置自定义属性在我的 Kotlin 项目中是这样的:

布局

<ImageView
android:id="@+id/imgView”
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
app:imageUrl="@{segment.url}"/>

代码

class Utils {
companion object {
@BindingAdapter("bind:imageUrl")
@JvmStatic
fun loadImage(view: ImageView, url:String)
{Picasso.with(view.context).load(url).error(R.drawable.error).into(view)}
}
}




我得到的运行时错误是:

A BindingAdapter in in <package.Utils.Companion> is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static.

有什么解决办法吗?

这仅适用于自定义属性。其余的数据绑定(bind)工作正常

最佳答案

只需将函数保留在顶层,不需要类或伴生对象,因为 Kotlin 中的顶层函数转换为名为 FileNameKt 的类的静态成员函数,所以它可以工作。除非被 @file:JvmName 覆盖注释

@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }

另一种选择是将扩展函数注释为 @BindingAdapter ,它将起作用,因为字节码签名将与 DataBindings 预期的签名完全匹配(生成的方法仍将接受扩展类的对象作为第一个参数),该函数也应保持顶级

@BindingAdapter("imageUrl")
fun ImageView.loadImage(url:String) { ... }

另一种选择是结合 BindingAdapter扩展属性如下:

@set:BindingAdapter("visible")
var View.visible
get() = visibility == VISIBLE
set(value) {
visibility = if (value) VISIBLE else GONE
}

关于Kotlin 自定义属性数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40085724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com