2011-03-01 12 views
5

en una actividad de android, primero recupero el texto en un EditText y agrego luego un TextWatcher a él.Llamada a TextWatcher incluso si el texto se establece antes de agregar el observador

private static int WC = 0; 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
Log.e("TextWatcherTest", "onCreate:\t" +CLASS_NAME); 
setContentView(R.layout.main); 

EditText et = (EditText)findViewById(R.id.editText); 
Log.e("TextWatcherTest", "Set text xyz"); 
et.setText("xyz"); 

et.addTextChangedListener(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 s) { 
     Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString()); 
    } 
}); 
} 

pero cuando corro la actividad, el método se llama afterTextChanged incluso si el propio vigilante se añade después de ajustar el texto. por lo que la salida del registro es algo así como

 
onCreate: LifecycleMain 
Set text xyz 
// screen rotation 
onCreate: LifecycleMain 
Set text xyz 
afterTextChanged: xyz 2 

el mostrador de la TextWatcher muestra que el observador que se llama es la que se ha añadido a continuación del texto se encuentra en el EditarTexto. ¿Alguna idea de por qué sucede eso y cómo puedo evitar eso?

Respuesta

1

Esto definitivamente debe estar sucediendo. Está configurando texto cuando savedinstanceState no es nulo (lo que significa que sus estados de objeto previos están guardados).

Creo que esto sucede porque ha agregado el TextWatcher a su EditText en el método onCreate, y la próxima vez que se llama a onCreate (por ejemplo, después de un cambio de configuración) encuentra que TextWatcher ya se ha agregado a EditText.

Si desea comprobar esta situación, poner esto antes de que su condición:

if(savedInstanceState == null){ 
    Log.e("savedInstance state is null", "no text"); 
    et.setText("No text"); 
} 

En este caso, si se llama a setText en su EditarTexto, entonces no será llamado afterTextChanged (editable s).

+0

realmente no. de hecho, es cierto que funciona la primera vez que se crea la actividad, pero EditText es cada vez una nueva instancia sin ningún vigilante conectado. Simplifiqué el código y agregué un contador al observador: – SimonSays

+0

¿Has definido editText et como estático? si es así, esta podría ser la razón. y como mencionas que funciona f9 por primera vez, entonces el problema es definitivamente que la nueva instancia de ediText no se está creando cada vez que –

+0

lo siento, actualizó mi comentario antes de que lo terminase. Actualicé el código de arriba ahora. Lo simplifiqué y agregué un contador para TextWatcher. lo que puede ver es que el problema no aparece la primera vez que se crea la actividad, sino la segunda vez. PERO, se llama a la segunda instancia de TextWatcher, no a la primera. también EditText siempre es una nueva instancia sin ningún vigilante conectado. y no; EditText no está definido estático. – SimonSays

7

La solución es mover su addTextChangedListener al método onPostCreate. todo será resuelto

+0

fue conveniente (en un Fragmento) para que compruebe "isResumed()" y solo responda a onTextChanged en este caso, pareció hacer el truco – hmac

+0

No funcionó para mí –

Cuestiones relacionadas