在调用 onTextChanged 时使用数据绑定为 EditText 加载 drawableLeft 图像
Load drawableLeft image for EditText using databinding when onTextChanged called
我想使用 databinding
和 MVVM pattern
创建示例表单。
在应用程序中,我想根据电子邮件验证在 EditText
上显示 drawableLeft
图像。
如果验证 return 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)
}
ViewModel->
@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)
}
希望对您有所帮助:)
我想使用 databinding
和 MVVM pattern
创建示例表单。
在应用程序中,我想根据电子邮件验证在 EditText
上显示 drawableLeft
图像。
如果验证 return 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)
}
ViewModel->
@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)
}
希望对您有所帮助:)