veces soñar significa que pierna pecho pareja muchas estomago espalda disparan cabeza android android-layout textwatcher

android - soñar - Los eventos de TextWatcher se disparan varias veces



soñar que te disparan en la pierna (4)

Tengo un problema molesto con TextWatcher. He estado buscando en la web pero no pude encontrar nada. apreciar si alguien podría ayudarme

Por alguna razón, las llamadas a los eventos de TextWatcher en un cambio de texto son erráticas. a veces se activan una vez (como deberían ser), a veces dos veces, y a veces 3 veces. No tengo idea de por qué, todo es muy directo. también a veces el parámetro Editable en afterTextChanged () devuelve valores vacíos en toString () y length ().

el código está abajo:

private TextWatcher mSearchAddressTextChangeListener = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable searchedAddress) { System.out.println("called multiple times."); } };

dentro de afterTextChanged() (y AsyncTask ) no estoy haciendo ningún cambio en el texto o la vista EditText .

Vi que la pregunta que se hacía en Eventos de TextWatcher se llamaba dos veces , pero los eventos se activaban más (o menos) que dos veces.

de todos modos, agradezco cualquier ayuda.

EDITAR: eliminé el contenido de afterTextChanged () porque este problema está sucediendo incluso sin mi código. lo que me lleva a creer que esto es un error. El error se produce cuando se ingresa un carácter "espacio" justo después de un carácter normal (los manejadores de eventos se activan dos veces) o cuando se elimina un carácter "espacio" después de eliminar un carácter normal (retroceso. Los manejadores de eventos se activan 3 veces). la ayuda aún será apreciada.


Tuve el mismo tipo de problema cuando presioné el botón de retroceso con el cursor al final de un texto continuo, después de llamar aTextChange 3 veces: - La primera vez con el valor s correcto - La segunda vez con un valor claro - La tercera vez con el valor correcto nuevamente

Después de buscar mucho en la web, traté de cambiar mi EditText inputType a

android:inputType="textNoSuggestions"

No me preguntes por qué, pero funcionó, afterTextChanged ahora se llama solo una vez.


De acuerdo con las páginas de desarrollador de TextWatcher , si se realiza un cambio en el Editable dentro de TextWatcher , se activarán más llamadas a todos los TextWatchers vinculados a ese Editable . Ahora, es evidente que su código no desencadena este comportamiento.

Sin embargo, es muy posible que si, por cualquier razón, el sistema tiene un TextWatcher en el Editable , la situación que usted describe pueda ocurrir. "Por qué", te escucho llorar, "¿debería pasar esto?"

En primer lugar, la defensa clásica: no hay ninguna razón para que no suceda y, estrictamente, el código de la aplicación debe escribirse para ser resistente.

En segundo lugar, no puedo probarlo, pero podría imaginar que el código que maneja el diseño del texto mostrado en un EditText usa un TextWatcher para manejar la actualización de la visualización del texto en la pantalla. Este código puede insertar códigos de control (que no se muestran) en Editable para garantizar buenos saltos de línea, etc. Incluso puede dar varias vueltas para hacerlo bien, y es posible que solo recibas tu primera llamada después de que haya hecho todo ...

EDITAR

Según el comentario de @Learn OpenGL ES, llamar a un TextWatcher sería normal para cosas como la autocorrección.


Puedes usar una verificación booleana, como:

inputBoxNumberEt.addTextChangedListener(new TextWatcher() { boolean ignoreChange = false; @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!ignoreChange) { ///Do your checks ignoreChange = true; inputBoxNumberEt.setText(string); inputBoxNumberEt.setSelection(inputBoxNumberEt.getText().length()); ignoreChange = false; } } });


boolean isOnTextChanged = false; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { isOnTextChanged = true; } @Override public void afterTextChanged(Editable quantity) { if (isOnTextChanged) { isOnTextChanged = false; //dosomething }