Estoy creando una aplicación de Android en la que quiero usar una función en la que un texto que hemos ingresado en un campo editText se puede convertir a mayúsculas en tiempo de ejecución solo en ese campo editText en particular.
He probado con este código
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() } })
Pero se puede hacer fácilmente con el concepto de adaptador de enlace inverso en Android. He intentado implementarlo con referencia a https://developer.android.com/reference/android/databinding/InverseBindingAdapter
No me funciona en mi proyecto. ¿Puedes explicarme con una explicación paso a paso?
Sí, este método de addTextChangedListener está disponible, pero tenemos que implementar este método para todos y cada uno de los Edittext que queremos convertir a mayúsculas. Así que escuchó bien sobre el adaptador InverseBinding. En InverserBinding Adapter, tenemos que crear este método una vez y puede usarlo cualquier cantidad de veces.
Implementé esto usando BindingAdapter e InverseBinding Adapter. En un archivo Kotlin, escriba estas dos funciones de la siguiente manera. Código de función
@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() }
Para Upper Case, he creado una variable en mayúsculas de MutableLiveData de tipo String
var uppercase = MutableLiveData("")
Ahora en XML he establecido esa propiedad de la siguiente manera:
<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" />