如何在 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" />
我正在创建一个 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" />