Android:两个EditText不能有两个addTextChangedListener吗?

时间:2012-02-04 23:30:07

标签: android crash android-edittext

我正在尝试创建两个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 :(得分:0)

LogCat中的错误消息是什么?找到与您的代码有关的那个 崖

答案 1 :(得分:0)

你可能正在堆叠溢出(具有讽刺意味的不是它)?

问题是当input_a获得焦点时,您将添加一个TextChangedListener,并在该侦听器中设置input_b的内容。这很好用。

但是,当焦点更改为input_b时,您将一个TextChangedListener添加到input_b,但您仍然具有input_a的TextChangedListener。现在当你输入input_b时,它改变了input_a的内容,触发了它改变input_b内容的TextChangeListener。这会触发input_b的TextChangedListener,您只需继续此循环。