在调用 onTextChanged 时使用数据绑定为 EditText 加载 drawableLeft 图像

Load drawableLeft image for EditText using databinding when onTextChanged called

我想使用 databindingMVVM 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)
}

希望对您有所帮助:)