数据绑定中带有多个参数的绑定适配器无法工作

9

我正在尝试使用数据绑定来加载图片,使用Glide、ImageView和BindingAdapter处理多个参数:

@BindingAdapter(value = ["url", "defaultImage", "placeholder", "circleCrop"], requireAll = false)
fun ImageView.setImageUrl(url: String, defaultResId: Int? = null, placeHolderResId: Int? = null, circleCrop: Boolean = false) {
    val glideRequest = if (defaultResId != null) GlideApp.with(context).loadOrDefault(url, defaultResId)
    else GlideApp.with(context).load(url)
    if (placeHolderResId != null) glideRequest.placeholder(placeHolderResId)
    if (circleCrop) glideRequest.circleCrop()
    glideRequest.into(this)
}

<ImageView
        android:id="@+id/imgProfile"
        android:layout_width="@dimen/size_avatar_search_result"
        android:layout_height="0dp"
        app:circleCrop="@{true}"
        app:defaultImage="@{@drawable/default_avatar}"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:placeholder="@{@drawable/default_avatar}"
        app:url="@{item.profilePhotoUrl}"
        tools:src="@drawable/default_avatar" />

BindingAdapter方法是一种顶级函数。在编译时,我会遇到databinding-kapt错误“无法找到android.widget.ImageView上参数类型为布尔值的属性'app:circleCrop'的setter”,就好像我的bindingadapter没有被识别一样。 不确定我做错了什么。

1个回答

16
虽然编译器说问题出在app:circleCrop,但实际问题出在defaultResIdplaceholderResId
当在XML中使用可绘制对象@{@drawable/default_avatar}时,它总是编译为Drawable
因此,您的绑定适配器必须具有以下签名:
@BindingAdapter(value = ["url", "defaultImage", "placeholder", "circleCrop"], requireAll = false)
fun ImageView.setImageUrl(url: String, default: Drawable? = null, placeholder: Drawable? = null, circleCrop: Boolean = false) {
  // code
}

当你查看生成的代码时,你会看到结果(例如对于布局 fragment_something.xml,通常是 FragmentSomethingBinding),在那里你会看到可绘制资源使用了 getDrawableFromResource() 函数。


我也遇到了同样的问题,你解决了吗? - ekouChiq
public static void setAnchorId(View view, @NonNull int anchorId, @NonNull boolean isPremiumUser) {....}``` 这段代码似乎对我无效。 - ekouChiq
你需要更详细地描述问题。例如,我认为可能的第一个问题是缺少requireAll=false,并且您没有同时使用两个属性(但这只是猜测)。请展示XML代码 :) - mlykotom
在 Kotlin 中,您需要使用方括号来表示数组。因此,代码如下所示: @BindingAdapter(value = ["anchorId", "isPremiumUser"]) public static void setAnchorId(View view, @NonNull int anchorId, @NonNull boolean isPremiumUser) {....}@mlyko 您可能也需要编辑您的回答。 - Edi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接