如何在 Kotlin 中使用反向绑定适配器将小写文本转换为大写?

How to use Inverse Binding Adapter in Kotlin for converting Lowercase text to Uppercase?

我正在创建一个 android 应用程序,我想在其中使用一项功能,在该功能中,我们输入到 editText 字段中的文本可以在运行时仅在特定的 editText 字段中转换为大写。

我试过这个代码

editText.addTextChangedListener(object : TextWatcher {
  override fun afterTextChanged(s: Editable?) {
  }

  override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
  }

  override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
     this.text.toString().uppercase()
  }
 })

但是通过android中的Inverse Binding Adapter的概念可以轻松做到。我试图参考 https://developer.android.com/reference/android/databinding/InverseBindingAdapter

它在我的项目中不适合我。你能一步一步地解释我吗?

是的 addTextChangedListener 的这个方法可用,但我们必须为每个要转换为大写的 Edittext 实现这个方法。因此,您对 InverseBinding Adapter 的了解是正确的。在 InverserBinding Adapter 中,我们必须创建此方法一次,您可以多次使用它。

我已经使用 BindingAdapter 和 InverseBinding Adapter.In 一个 Kotlin 文件实现了这个,按如下方式编写这两个函数。 Function Code

@BindingAdapter(value = ["setText", "custom:AttrChanged"], requireAll = false)
fun EditText.updateText(text: String?, listener: InverseBindingListener) {
    if (this.text.toString() != text) {
        this.setText(text)
    }
    this.doOnTextChanged { _: CharSequence?, _: Int?, _: Int?, _: Int? ->
        listener.onChange()
    }
}

@InverseBindingAdapter(attribute = "setText", event = "custom:AttrChanged")
fun EditText.getUpdatedText(): String? {
    return this.text.toString().uppercase()
}

对于大写字母,我创建了一个字符串类型的 MutableLiveData 大写变量

var uppercase = MutableLiveData("")

现在 XML 我已将 属性 设置如下:

<androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/edit_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        setText="@={viewModels.uppercase}"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_login_data_binding" />