在BindingAdapter中使用@BindingConversion注解,将drawable类型参数转换为int类型参数。例如:
@BindingAdapter("app:image")
fun setImage(view: ImageView, drawable: Drawable?) {
drawable?.let {
val resourceId = getResourceId(it)
if (resourceId != 0) {
view.setImageResource(resourceId)
}
}
}
@BindingConversion
fun fromDrawable(drawable: Drawable): Int {
return getResourceId(drawable)
}
private fun getResourceId(drawable: Drawable): Int {
when (drawable) {
is BitmapDrawable -> {
val bitmap = drawable.bitmap
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
val byteArray = stream.toByteArray()
return view.context.resources.getIdentifier(
byteArray.toString(Charsets.UTF_8),
"drawable",
view.context.packageName
)
}
is VectorDrawable -> {
return view.context.resources.getIdentifier(
drawable.name,
"drawable",
view.context.packageName
)
}
else -> {
// Other types of drawables
return 0
}
}
}
其中,fromDrawable()函数将drawable类型参数转换为int类型参数,getResourceId()函数获取资源id。在BindingAdapter中,通过getResourceId()函数获取资源id,然后设置给ImageView。