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

标签 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()
  }
 })
但是可以通过android中的Inverse Binding Adapter的概念轻松完成。我试图引用
https://developer.android.com/reference/android/databinding/InverseBindingAdapter
它在我的项目中不适合我。你能用一步一步的解释来解释我吗?

最佳答案

是的 addTextChangedListener 的这个方法是可用的,但是我们必须为每个我们想要转换为大写的 Edittext 实现这个方法。因此,您对 InverseBinding 适配器的了解是正确的。在 InverserBinding Adapter 中,我们必须创建一次此方法,您可以多次使用它。
我已经使用 BindingAdapter 和 InverseBinding Adapter 实现了这一点。在一个 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" />

关于android - 如何在 Kotlin 中使用反向绑定(bind)适配器将小写文本转换为大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71908508/

相关文章:

java - 在 Android 上覆盖应用程序并删除数据库

android - 如何为 android :layout_marginLeft based LiveData<Boolean> in Android Studio? 绑定(bind)不同的值

Kotlin:如果 E 是实现接口(interface) I 的枚举类,则从返回类型为 Array<I> 的函数返回 Array<E>

android - BindingAdapter 中的高阶函数

android - "CREATE TABLE"附近的 SQLite 语法错误

java - 为什么在我专门阻止这种情况后,一个随机 int 会变得与另一个随机 int 相同?

android - 当我从 android 中的表中获取数据时,背景屏幕变黑并且我对此无法控制

list - 如何在 Kotlin 中初始化 List<T>?

android - 如何在 Jetpack 组合中使用 Viewmodel