0

在 PC 上,我可以为 JTextField 添加一个 onKeyListener 来监听 keyReleased 事件。在 Android 上,我使用了 addTextChangedListener。

我的 Android 应用程序中有两个 EditText 字段。编辑一个会影响另一个。这将导致程序在堆栈溢出错误中失败。

如何收听手机的键盘而不是 EditText 字段中的更改?我不希望程序因为监听器造成的无限循环而调用监听器。

4

2 回答 2

5

附加一个 onFocusChangedListener 并在 EditText 具有焦点时添加 TextChangedListener 并在失去焦点时将其删除。像这样的东西:

 EditText1.setOnFocusChangeListener(new OnFocusChangeListener() {

                public void onFocusChange(View v, boolean hasFocus) {
                    if(hasFocus){
                        ((EditText) v).addTextChangedListener(new TextWatcher() {

                        public void onTextChanged(CharSequence s, int start, int before, int count) {
                             //

                        }

                        public void beforeTextChanged(CharSequence s, int start, int count,
                                int after) {
                            // 

                        }

                        public void afterTextChanged(Editable s) {
                            // affect EditText2

                        }
                    });

                }
                if(!hasFocus){
                    ((EditText) v).removeTextChangedListener();
                }
            }
        });

        }
    });

EditText2 也一样

于 2012-09-18T13:33:04.007 回答
1

首先,我将创建一个文本更改侦听器,类似于SynchronizingWatcher并将其附加到两个EditTexts。然后,当您收到文本更改事件时,在更新其他文本编辑之前,只需取消注册旧的侦听器,更新文本并再次启用侦听器:

class SynchronizingWatcher implements TextWatcher {
  Set<EditText> synchronizedViews = new HashSet<EditText>();

  public void watchView(EditText view) {
    view.addTextChangedListener(this);
    synchronizedViews.add(view);
  }

  public void afterTextChanged(Editable s) {
    for (EditText editText : synchronizedViews) {
      editText.removeTextChangeListener(this);
      editText.setText(s);  // Of course you can do something more complicated here.
      editText.addTextChangeListener(this);
    }
  }

  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // Don't care.
  }

  public void onTextChanged(CharSequence s, int start, int before, int count) {
    // Don't care.
  }
}

...
// Somewhere in your activity:
SyncrhonizingWatcher synchronizingWatcher = new SynchronizingWatcher();
synchronizingWatcher.watchView(myEditText1);
synchronizingWatcher.watchView(myEditText1);

另一种解决方案:提供你自己KeyListener装饰现有的KeyListener(你可以得到现有的关键监听editText.getKeyListener()器和设置你的装饰器editText.setKeyListener()。你的装饰器也会更新其他编辑文本onKeyUp()。但我会尽量避免弄乱那些东西。

于 2012-09-18T00:28:42.493 回答