Android: не может быть двух addTextChangedListener для двух EditText? - PullRequest
5 голосов
/ 05 февраля 2012

Я пытаюсь создать два EditText, где я набираю что-нибудь в одном из EditText, набранный мной текст будет показан на другом 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

            }

        });
    }

Так что, когда я набираю input_a, он работает нормально, вводимый мной текст отображается в input_b, однако, когда я набираю input_b, приложение неожиданно закрывается. Я не понимаю, почему два блока кодов действительно похожи, но работает только один из них.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2012

Возможно, вы получаете переполнение стека (ирония, не правда ли)?

Проблема в том, что когда input_a получает фокус, вы добавляете TextChangedListener и в этом слушателе вы устанавливаете содержимое для input_b. Это работает просто отлично.

Однако, когда фокус меняется на input_b, вы добавляете TextChangedListener к input_b, но у вас все еще есть TextChangedListener для input_a. Теперь, когда вы вводите в input_b, он изменяет содержимое input_a, что вызывает его TextChangeListener, который изменяет содержимое input_b. Это вызывает TextChangedListener для input_b, и вы просто продолжаете этот цикл.

0 голосов
/ 05 февраля 2012

Что было сообщение об ошибке в LogCat?Найдите тот, который относится к вашему коду.
Клифф

...