Tengo un EditText
campo con un Customer Text Watcher. En un fragmento de código, necesito cambiar el valor en el EditText que uso .setText("whatever")
.
El problema es que tan pronto como hago ese cambio afterTextChanged
, se llama al método que crea un bucle infinito. ¿Cómo puedo cambiar el texto sin que se active afterTextChanged?
Necesito el texto en el método afterTextChanged, así que no sugiera eliminar el TextWatcher
.
java
android
event-handling
infinite-loop
usuario1143767
fuente
fuente
Respuesta corta
Puede comprobar qué Vista tiene actualmente el foco para distinguir entre los eventos activados por el usuario y el programa.
Respuesta larga
Como una adición a la respuesta corta: en caso de que
myEditText
ya tenga el enfoque cuando cambia programáticamente el texto al que debe llamarclearFocus()
, luego llamasetText(...)
y luego vuelve a solicitar el enfoque. Sería una buena idea poner eso en una función de utilidad:Para Kotlin:
Dado que Kotlin admite funciones de extensión, su función de utilidad podría verse así:
fuente
getActivity().getCurrentFocus()
y kotlinactivity?.currentFocus
hasFocus()
directamente alEditText
.Uso:
Puede sentir un poco de retraso al ingresar texto rápidamente si está utilizando editText.setText () en lugar de editable.replace () .
fuente
Truco fácil de arreglar ... siempre que su lógica para derivar el nuevo valor de texto de edición sea idempotente (lo que probablemente sería, pero solo digo). En su método de escucha, solo modifique el texto de edición si el valor actual es diferente al de la última vez que modificó el valor.
p.ej,
fuente
setText()
y volver a agregarlo después.Yo uso de esa manera:
Y cada vez que necesite cambiar el texto mediante programación, primero borre el enfoque
fuente
Puede usar la sintaxis DSL de Kotlin para tener la solución genérica para esto:
Y dentro de su TextWatcher, puede usarlo como:
fuente
Esto funciona bien para mi
fuente
El problema se puede resolver fácilmente usando
tag
archivado y ni siquiera tiene que lidiar con el enfoque de editText.Establecer el texto y la etiqueta mediante programación
Comprobando el
tag
onTextChangedfuente
Si necesita concentrarse en
EditText
cambiar el texto, puede solicitar el enfoque:fuente
prueba esta lógica: quería establecer setText ("") sin ir al bucle infinito y este código funciona para mí. Espero que pueda modificar esto para que se ajuste a sus necesidades.
fuente
Aquí hay una clase útil que proporciona una interfaz más simple que TextWatcher para el caso normal de querer ver los cambios a medida que ocurren. También permite ignorar el siguiente cambio solicitado por el OP.
Úselo así:
Siempre que desee modificar el contenido de
editText
sin provocar una cascada de ediciones recursivas, haga lo siguiente:fuente
Mi variante:
Configure oyentes solo usando setOnTextChangeListener () y configure texto solo usando setNewText (quería anular setText (), pero es final)
fuente
He creado una clase abstracta que mitiga el problema cíclico de cuándo se realiza una modificación al EditText a través de TextWatcher.
fuente
Muy simple, configure texto con este método
fuente
Debe asegurarse de que la implementación de los cambios de texto sea estable y no cambie el texto si no se necesita ningún cambio. Normalmente, ese sería cualquier contenido que ya haya pasado por el observador una vez.
El error más común es establecer un nuevo texto en el EditText asociado o en el Editable aunque el texto no haya sido modificado.
Además de eso, si realiza sus cambios en Editable en lugar de en una Vista específica, puede volver a utilizar fácilmente su observador, y también puede probarlo de forma aislada con algunas pruebas unitarias para asegurarse de que tenga el resultado que desea.
Dado que Editable es una interfaz, incluso podría usar una implementación ficticia de la misma que arroje una RuntimeException si se llama a alguno de sus métodos para intentar cambiar su contenido, al probar contenido que debería ser estable.
fuente
Mi forma de hacer las cosas:
En el segmento de escritura
El oyente
Funciona de todos modos.
fuente