7

我正在尝试使用数据绑定来加载具有多个参数的 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 方法是顶级函数。编译时出现数据绑定-kapt 错误“在 android.widget.ImageView 上找不到参数类型为布尔型的属性 'app:circleCrop' 的设置器”,就好像我的 bindingadapter 无法识别一样。不知道我做错了什么

4

1 回答 1

14

尽管该编译器说问题出在 with 上app:circleCrop,但实际问题出在defaultResIdandplaceholderResId上。

在 xml 中使用 drawables 时@{@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()函数。

于 2018-03-19T21:39:49.513 回答