Android 传递多个参数的绑定适配器导致错误

Android binding adapter passing multiple arguments cause error

我是 Android Data Binding 的新手。我正在学习本教程:Data Binding Library。 我正在尝试做一个接收多个参数的适配器。这是我的代码:

XML

   <ImageView
            android:layout_width="@dimen/place_holder_size"
            android:layout_height="@dimen/place_holder_size"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_centerVertical="true"
            app:url="@{image.imageUrl}"
            app:size="@{@dimen/place_holder_size}"
            />

绑定适配器CLASS

public class ViewBindingAdapters extends BaseObservable {

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
    if (!Strings.isNullOrEmpty(url)) {
        Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
    }
}
....


}

但是我收到这个错误:

java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Cannot find the setter for attribute 'app:url' with parameter type java.lang.String on android.widget.ImageView. file:... li_image_item.xml loc:30:27 - 30:40 ****\ data binding error ****

有人知道为什么吗?

提前致谢!

试试这个

 @BindingAdapter(value={"url", "size"}, requireAll=false)
 public static void loadImage(ImageView imageView, String url, int size) {
        if (!Strings.isNullOrEmpty(url)) {
            Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
        }
    }

问题是 @dimen/place_holder_size,它是 returns float 而你正在捕捉它 int

把你的BindingAdapter方法改成这个

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

可以参考this

更新

您不需要创建前缀 bind:,只需使用它即可。

@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

在 xml 中使用任何前缀,例如 app:

app:url="@{image.imageUrl}"

我做错的是函数中参数的顺序。您可以在绑定适配器中添加多个属性,但它们应该与方法中定义的相同序列的参数相匹配

这是我的 Kotlin 代码片段

@BindingAdapter(value = ["bind:brand", "bind:model", "bind:age"], requireAll = false)
@JvmStatic
fun bindProductDetails(linearLayout: LinearLayout, brand: String?, model: String?, age: String?) {
    if (brand != null && !brand.isEmpty()) {
        //code
        //code

    }
}

除了@Kishan Solanki 上面提供的示例之外,随着数据绑定库中发生的变化,您只需要用逗号分隔值声明它们。例子

@BindingAdapter("loadImageFrom", "widthDp")
fun loadImages(imageView: ImageView, url: String?, widthDp: Int) {
    url?.let {

        val height = (widthDp / 3) * 4
        val fullUrl = getImagePosterUrl(url)
        Picasso.get().load(fullUrl).resize(widthDp.px, height.px).into(imageView)
    }

}

但最重要的是要记住,您以 DataBinding 格式向适配器属性提供数据。

在 XML 中提供 Int 作为参数的示例,您必须编写

app:widthDp="@{120}"

这是

app:your_attribute="@{your_data}"

P. S. - 哦,还有一件事,widthDp**.px** 是一个扩展函数,它根据屏幕密度将 dp 值的 Int 转换为相关像素值。所以不要混淆。

参见https://developer.android.com/topic/libraries/data-binding/binding-adapters

@BindingAdapter("imageUrl", "placeholder", requireAll = false)
fun ImageView.setImageUrl(url: String?, placeHolder: Drawable?) {
    if (url == null) {
        setImageDrawable(placeholder)
    } else {
        MyImageLoader.loadInto(this, url, placeholder)
    }
}

请注意,BindingAdapter 属性和 setImageUrl 参数可能有不同的名称。但他们应该按照相同的顺序进行。如果其中一些属性定义在XML中(在这个例子中是ImageView),这个方法将被调用。

<ImageView 
    app:imageUrl="@{venue.imageUrl}"
    app:placeholder="@{@drawable/venueError}" />

属性的类型应与方法中定义的类型相同。您也可以使用 . Instead of Kotlin lambdas use interfaces.

这个class应该和XML放在同一个模块中。否则你会得到类似 AAPT: error: attribute imageUrl (aka com.example.imageUrl) not found..

的错误