使用DataBinding设置ImageView tint:弃用属性报错及解决方案咨询
DataBinding中app:tint报错的原因与解决方法
我之前也碰到过一模一样的问题,咱们先拆解下报错的核心原因:
报错原因
旧的android:tint属性在DataBinding中有默认适配逻辑,它能自动把你传入的int类型颜色值转换成ImageView需要的ColorStateList类型,所以可以正常运行。但换成app:tint后,DataBinding找不到能直接接收int参数的setter方法——因为AndroidX里ImageView的tint相关API(比如setImageTintList())要求的参数是ColorStateList,而非单纯的int颜色值,因此抛出了找不到合适setter的错误。
两种解决方法,选你顺手的来就行
方法一:直接把int颜色转成ColorStateList(无需自定义适配器)
先在布局的data标签里导入ColorStateList类:
<data> <import type="android.content.res.ColorStateList" /> <!-- 其他导入或变量声明 --> </data>
然后修改app:tint的绑定代码,用ColorStateList.valueOf()把int颜色转换成要求的类型:
app:tint="@{ColorStateList.valueOf(plantEntity.isFavorite ? @color/favorite : @color/favorite_none)}"
方法二:自定义BindingAdapter(适合多处复用的场景)
如果项目里很多地方都需要用这种int直接绑定tint的逻辑,可以写一个自定义BindingAdapter统一处理:
import android.widget.ImageView import android.content.res.ColorStateList import androidx.databinding.BindingAdapter @BindingAdapter("app:tint") fun ImageView.setTintColor(color: Int) { this.imageTintList = ColorStateList.valueOf(color) }
写完这个适配器后,你原来的布局代码app:tint="@{plantEntity.isFavorite ? @color/favorite : @color/favorite_none}"就能直接正常运行,DataBinding会自动调用你写的方法来设置tint。
内容的提问来源于stack exchange,提问作者Jéwôm'
相关产品推荐
相关产品推荐

