Android中使用Databinding如何重置EditText的BackgroundTint属性
问题根源
你当前写法传入0无法达到重置tint为null的效果,因为0是有效颜色值(对应透明),和null完全不等价;且原生DataBinding对backgroundTint属性的绑定不支持直接在三元表达式中返回null,会触发类型不兼容的编译错误。
最优解决方案:自定义BindingAdapter实现
该方案完全等效于代码中设置backgroundTintList = null的效果,逻辑解耦复用性高。
1. 编写自定义BindingAdapter代码
如果需要支持任意颜色传入,使用多参数版本:
import android.widget.EditText import android.content.res.ColorStateList import androidx.core.content.ContextCompat import androidx.databinding.BindingAdapter @BindingAdapter(value = ["tintColorRes", "tintEnableCondition"], requireAll = true) fun EditText.setDynamicBackgroundTint(tintColorRes: Int, enableCondition: Boolean) { backgroundTintList = if (enableCondition) { ColorStateList.valueOf(ContextCompat.getColor(context, tintColorRes)) } else { null } }
如果仅需要固定黄色的场景,可以简化为单参数版本:
import android.widget.EditText import android.content.res.ColorStateList import androidx.core.content.ContextCompat import androidx.databinding.BindingAdapter @BindingAdapter("fooStateTint") fun EditText.setFooStateTint(enableTint: Boolean) { backgroundTintList = if (enableTint) { ColorStateList.valueOf(ContextCompat.getColor(context, R.color.yellow)) } else { null } }
2. 调整XML属性
替换原来的android:backgroundTint属性即可:
多参数版本用法:
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" app:tintColorRes="@{R.color.yellow}" app:tintEnableCondition="@{vm.foo}" android:afterTextChanged="@{(edtitable)->vm.afterTextChanged(edtitable)}" android:maxLines="1" android:singleLine="true" app:onTouched="@{vm}" />
单参数版本用法:
app:fooStateTint="@{vm.foo}"
内容的提问来源于stack exchange,提问作者user1865027
相关产品推荐
相关产品推荐

