首页 > 解决方案 > 调用 onTextChanged 时使用数据绑定为 EditText 加载 drawableLeft 图像

问题描述

我想使用databindingand创建示例表单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
    }

标签: androidmvvmandroid-databindingtwo-way-binding

解决方案


您可以使用自定义绑定适配器来执行此操作:

首先,您的数据应该包含某种标志,用于确定电子邮件是否错误 ( 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)
}

希望它有所帮助:)


推荐阅读