Android en el Listener de cambio de texto

Tengo una situación, donde hay dos campos. Field2 y Field2 . Todo lo que quiero hacer es vaciar Field2 cuando se cambia Field1 y viceversa. Así que al final sólo un campo tiene contenido en él.

 Field1 = (EditText)findViewById(R.id.field1); Field2 = (EditText)findViewById(R.id.field2); Field1.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { Field2.setText(""); } }); Field2.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { Field1.setText(""); } }); 

Funciona bien si adjunto addTextChangedListener a Field1 solamente, pero cuando lo hago para ambos campos, la aplicación se bloquea. Obviamente porque intentan cambiarse indefinidamente. Una vez que Field1 cambia, borra Field2 en este momento Field2 se cambia por lo que borrará Field1 y así sucesivamente …

¿Puede alguien sugerir alguna solución?

6 Solutions collect form web for “Android en el Listener de cambio de texto”

Puede agregar una comprobación para borrar sólo cuando el texto en el campo no está vacío (es decir, cuando la longitud es diferente de 0).

 Field1.addTextChangedListener(new TextWatcher() { @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(s.length() != 0) Field2.setText(""); } }); Field2.addTextChangedListener(new TextWatcher() { @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(s.length() != 0) Field1.setText(""); } }); 

Documentación para TextWatcher aquí .

También respete las convenciones de nombres .

Sé que esto es viejo, pero alguien podría encontrar esto de nuevo algún día.

Tuve un problema similar en el que llamaría setText en un EditText y onTextChanged se llamaría cuando no quería hacerlo. Mi primera solución fue escribir algún código después de llamar a setText () para deshacer el daño hecho por el oyente. Pero eso no era muy elegante. Después de hacer algunas investigaciones y pruebas descubrí que el uso de getText (). Clear () borra el texto de la misma manera que setText (""), pero como no se establece el texto, el oyente no se llama, Resuelto mi problema. Cambié todas mis llamadas de setText ("") a getText (). Clear () y ya no necesitaba los vendajes, así que tal vez eso solucione su problema también.

Prueba esto:

 Field1 = (EditText)findViewById(R.id.field1); Field2 = (EditText)findViewById(R.id.field2); Field1.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { Field2.getText().clear(); } }); Field2.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { Field1.getText().clear(); } }); 

Marque String antes de establecer otro EditText para vaciar. Si Field1 está vacío entonces ¿por qué es necesario cambiar de nuevo a ("")? Así que usted puede comprobar el tamaño de su secuencia con s.lenght () o cualquier otra solución

Otra manera que puede comprobar la longitud de la cadena es:

 String sUsername = Field1.getText().toString(); if (!sUsername.matches("")) { // do your job } 

También he enfrentado el mismo problema y seguir recibiendo excepciones de pila completa, y vengo con la siguiente solución.

  edt_amnt_sent.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { if (skipOnChange) return; skipOnChange = true; try { //method } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { skipOnChange = false; } } }); edt_amnt_receive.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { if (skipOnChange) return; skipOnChange = true; try { //method } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { skipOnChange = false; } } }); 

Declarado inicialmente booleano skipOnChange = false;

También puede utilizar el método hasFocus ():

 public void onTextChanged(CharSequence s, int start, int before, int count) { if (Field2.hasfocus()){ Field1.setText(""); } } 

Probado esto para una asignación de la universidad que estaba trabajando encendido para convertir escalas de la temperatura mientras que el usuario las mecanografió adentro. Trabajó perfectamente, y es manera más simple.

Un poco tarde de una respuesta, pero aquí hay una solución reutilizable:

 /** * An extension of TextWatcher which stops further callbacks being called as * a result of a change happening within the callbacks themselves. */ public abstract class EditableTextWatcher implements TextWatcher { private boolean editing; @Override public final void beforeTextChanged(CharSequence s, int start, int count, int after) { if (editing) return; editing = true; try { beforeTextChange(s, start, count, after); } finally { editing = false; } } protected abstract void beforeTextChange(CharSequence s, int start, int count, int after); @Override public final void onTextChanged(CharSequence s, int start, int before, int count) { if (editing) return; editing = true; try { onTextChange(s, start, before, count); } finally { editing = false; } } protected abstract void onTextChange(CharSequence s, int start, int before, int count); @Override public final void afterTextChanged(Editable s) { if (editing) return; editing = true; try { afterTextChange(s); } finally { editing = false; } } public boolean isEditing() { return editing; } protected abstract void afterTextChange(Editable s); } 

Por lo tanto, cuando se utiliza lo anterior, cualquier setText() llamadas que ocurren en el TextWatcher no resultará en el TextWatcher que se llama de nuevo:

 /** * A setText() call in any of the callbacks below will not result in TextWatcher being * called again. */ public class MyTextWatcher extends EditableTextWatcher { @Override protected void beforeTextChange(CharSequence s, int start, int count, int after) { } @Override protected void onTextChange(CharSequence s, int start, int before, int count) { } @Override protected void afterTextChange(Editable s) { } } 
  • Cómo deshabilitar Android LocationListener cuando se cierra la aplicación
  • Desplazamiento del cuadro de selección de tiempo en Samsung S4 OS 4.3
  • Notification pendingIntent contentIntent falla cuando terminan las llamadas de actividad ()
  • ¿Cómo representar una relación Many-To-Many en XML o en otro formato de archivo simple?
  • ¿Cómo mostrar una barra de progreso cuando WebView carga una URL en Android?
  • BufferedReader no lee todas las líneas del archivo
  • ¿Puedo desarrollar aplicaciones de Android sin IDE?
  • Android 6.0 RuntimeException: No se puede conectar al servicio de cámara
  • ¿Cuál es el tiempo de espera predeterminado de java.net.Socket en android?
  • Antecedentes Proceso para escanear la ubicación del usuario a intervalos regulares y actualizar la base de datos local incluso cuando la aplicación no está abierta
  • ¿Cómo cambiar algún valor en el archivo .java de build.gradle?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.