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

标签 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 时,应用程序意外关闭。我不明白为什么这两个代码块非常相似,但只有一个有效。

最佳答案

您可能遇到了堆栈溢出(很讽刺,不是吗)?

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

但是,当焦点更改为 input_b 时,您将 TextChangedListener 添加到 input_b,但您仍然拥有用于 input_a 的 TextChangedListener。现在,当您键入 input_b 时,它会更改 input_a 的内容,从而触发其 TextChangeListener,从而更改 input_b 的内容。这会触发 input_b 的 TextChangedListener,您只需继续此循环即可。

关于Android:两个 EditText 不能有两个 addTextChangedListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145564/

相关文章:

java - Android 上的 OpenCV 转换为灰度无法正常工作

java - 键盘无法抬起编辑文本,因为scrollview

Android:DownloadManager 是作为 FIFO 还是同时下载文件

ios - Swift:iOS 12.2 应用程序在启动时崩溃

android - 如果网站不可用,Android应用程序崩溃

android - EditText 的自定义字典

android - 如何对特定的 JUnit 测试用例执行 @After?

android - 制作签名 APK 后应用程序崩溃?

android - EditText - 如何将在 EditText 中键入的字符分隔成组或 block

android - 尝试在空对象引用上调用虚拟方法 尝试在空对象引用上调用虚拟方法 android.widget.EditText.getText()