android - 调用 onTextChanged 时使用数据绑定为 EditText 加载 drawableLeft 图像
问题描述
我想使用databinding
and创建示例表单MVVM pattern
。在应用程序中,我想根据电子邮件验证显示drawableLeft
图像。EditText
如果验证返回 true,则设置drawableLeft
成功图像,否则失败。
布局->
<EditText
android:id="@+id/email_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/email_hint"
android:inputType="textEmailAddress"
android:onTextChanged="@{viewModel::onEmailChange}"
android:text="@={viewModel.loginModel.emailId}"
android:textSize="@dimen/_12sdp"
app:drawableEnd="@{viewModel.loginModel.image}" />
绑定适配器->
@JvmStatic
@androidx.databinding.BindingAdapter("drawableEnd")
fun setDrawableEnd(view: MyTextInputEditTextRegular, resourceId: Int) {
Log.e("resourceId","... $resourceId")
val drawable = ContextCompat.getDrawable(view.context, resourceId)
setIntrinsicBounds(drawable)
val drawables = view.compoundDrawables
view.setCompoundDrawables(drawables[1], drawables[2], drawable, drawables[3])
}
private fun setIntrinsicBounds(drawable: Drawable?) {
drawable?.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
}
视图模型->
@Bindable
private fun getImage(): Int {
return R.drawable.ic_check
}
解决方案
您可以使用自定义绑定适配器来执行此操作:
首先,您的数据应该包含某种标志,用于确定电子邮件是否错误 ( isValid: Boolean
)。每次 editText 中的内容发生更改时,您都需要更新该值。
在xml中你需要为editText引入属性:
<EditText
//properties
app:drawableLeftValidation="@{vm.isValid}"
>
然后创建自定义绑定适配器
@BindingAdapter("drawableLeftValidation")
fun setDrawableLeftByValidation(editText: EditText, isValid: Boolean) {
val leftDrawable = if (isValid) {
ContextCompat.getDrawable(editText.context, R.drawable.your_drawable)
} else {
null
}
editText.setCompoundDrawables(leftDrawable, null, null, null)
}
希望它有所帮助:)
推荐阅读
- java - 如何从数据库中阻止/剪切特定字段中的 pdf 文件?
- python - Python 和 ElasticSearch:将 CSV 转换为带有索引的 JSON
- javascript - 如何随机获取一个属性
- sql - 在我的情况下,如何在 SQL Server 中解决“从字符串转换日期和/或时间时转换失败”
- php - 如何在 facebook php sdk 中获取用户个人资料 ID
- python - 如何防止在python中对数组中的特定条目组合进行重复数据删除?
- vuetify.js - Vuetify v-select 或 v-autocomlete 中值比较器的用途是什么
- android - 为我自己的 GMail 帐户获取 OAuth 凭据
- android-security - 您的应用正在使用具有不安全 openFile 实现的内容提供程序
- c# - Microsoft App Center:如何获取具有会话持续时间的用户列表?