具有多个参数的数据绑定绑定适配器不起作用
Databinding bindingadapter with multiple parameters not working
我正在尝试使用数据绑定通过 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' 的 setter”,就好像我的绑定适配器无法识别一样。
不确定我做错了什么
尽管编译器说问题出在 app:circleCrop
,但实际问题出在 defaultResId
和 placeholderResId
。
在xml@{@drawable/default_avatar}
中使用drawables时总是编译成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()
功能。
我正在尝试使用数据绑定通过 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' 的 setter”,就好像我的绑定适配器无法识别一样。 不确定我做错了什么
尽管编译器说问题出在 app:circleCrop
,但实际问题出在 defaultResId
和 placeholderResId
。
在xml@{@drawable/default_avatar}
中使用drawables时总是编译成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()
功能。