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)
| 归档时间: |
|
| 查看次数: |
746 次 |
| 最近记录: |