2012-02-04 11 views
5

Estoy tratando de hacer dos EditText donde escribo algo en uno de EditText, el texto que escribí se mostrará en el otro EditText.Android: no puede tener dos addTextChangedListener para dos EditText?

private EditText input_a; 
private EditText input_b; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    input_a = (EditText) findViewById(R.id.input_a); 
    input_b = (EditText) findViewById(R.id.input_b); 
    input_a.setOnFocusChangeListener(this); 
    input_b.setOnFocusChangeListener(this); 
} 
@Override 
public void onFocusChange(View v,boolean hasFocus) { 
    // TODO Auto-generated method stub 
    if(v==input_a && hasFocus){ 
     input_a.setText(""); 
     input_b.setText(""); 
     input_a.addTextChangedListener(new TextWatcher(){ 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 
       input_b.setText(input_a.getText()); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
       // TODO Auto-generated method stub 

      } 

     }); 

    }else if(v==input_b && hasFocus){ 
     input_b.setText(""); 
     input_a.setText(""); 
     input_b.addTextChangedListener(new TextWatcher(){ 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 
       input_a.setText(input_b.getText()); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
       // TODO Auto-generated method stub 

      } 

     }); 
    } 

Así que cuando escribo en el input_a, que funciona bien, la entrada de texto que se muestra en la input_b, sin embargo, cuando escribo en el input_b, la aplicación se cierre inesperadamente. No veo por qué los dos bloques de códigos son realmente similares, pero solo uno de ellos funciona.

Respuesta

0

Probablemente esté recibiendo un desbordamiento de la pila (¿no es irónico)?

El problema es que cuando input_a obtiene el foco, está agregando un TextChangedListener y en ese oyente establece los contenidos para input_b. Esto funciona bien.

Sin embargo, cuando el foco cambia a input_b, agrega un TextChangedListener a input_b pero todavía tiene el TextChangedListener para input_a también. Ahora, cuando escribe en input_b, cambia el contenido de input_a que activa su TextChangeListener, que cambia el contenido de input_b. Esto activa TextChangedListener para input_b y simplemente continúa este ciclo.

+0

Creo que sí, eso puede explicar por qué recibí una serie de mensajes de error que parece un ciclo infinito. Muchas gracias! Probé eliminarTextChangedListener antes de agregar el nuevo TextChangedListener y funciona. – xiaoyao

0

¿Cuál fue el mensaje de error en LogCat? Encuentra el que se relaciona con tu código.
Acantilado

Cuestiones relacionadas