2012-02-04 16 views
5

Próbuję utworzyć dwa EditText, w których wpisuję cokolwiek w jednym z EditText, tekst, który wpisałem, będzie wyświetlany w innym EditText.Android: nie można mieć dwóch addTextChangedListener dla dwóch 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 

      } 

     }); 
    } 

Więc kiedy wpisać input_a, to działa w porządku, ja wprowadzania tekstu jest pokazany w input_b jednak kiedy wpisuję w input_b, aplikację blisko niespodziewanie. Nie rozumiem, dlaczego te dwa bloki kodów są naprawdę podobne, ale tylko jeden z nich działa.

Odpowiedz

0

Prawdopodobnie pojawia się przepełnienie stosu (ironia, prawda?)?

Problem polega na tym, że gdy input_a dostaje fokus, dodajemy TextChangedListener iw tym detektorze ustawiamy zawartość dla input_b. Działa to dobrze.

Jednak gdy fokus zmieni się na input_b, dodajesz TextChangedListener do input_b, ale nadal masz TextChangedListener również dla input_a. Teraz, gdy wpiszesz w input_b zmieni ona zawartość input_a, która wyzwala jej TextChangeListener, która zmienia zawartość input_b. Spowoduje to uruchomienie TextChangedListener dla input_b i po prostu kontynuujesz ten cykl.

+0

Myślę, że to może wyjaśnić, dlaczego dostałem serię komunikatów o błędach, które wydają się być nieskończoną pętlą. Dziękuję bardzo! Próbowałem removeTextChangedListener przed dodaniem nowego TextChangedListener i działa! – xiaoyao

0

Jaki był komunikat o błędzie w LogCat? Znajdź ten, który odnosi się do twojego kodu.
Cliff

Powiązane problemy