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

Jay*_*hah 6 android kotlin android-binding-adapter bindingadapter

我正在创建一个 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()
  }
 })
Run Code Online (Sandbox Code Playgroud)

但是通过android中的Inverse Binding Adapter的概念就可以轻松完成。我尝试参考 https://developer.android.com/reference/android/databinding/InverseBindingAdapter来实现它

它在我的项目中对我不起作用。你能一步步解释一下吗?

小智 6

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

我已经使用 BindingAdapter 和 InverseBinding Adapter 实现了这一点。在一个 Kotlin 文件中,按如下方式编写这两个函数。 功能码

@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()
}
Run Code Online (Sandbox Code Playgroud)

对于大写,我创建了一个 String 类型的 MutableLiveData 大写变量

var uppercase = MutableLiveData("")
Run Code Online (Sandbox Code Playgroud)

现在在 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" />
Run Code Online (Sandbox Code Playgroud)