在PC上我可以为JTextField添加一个onKeyListener来监听keyReleased事件。在Android上我使用了addTextChangedListener。
我的Android应用程序中有两个EditText字段。编辑一个将影响另一个。这将导致程序在堆栈溢出错误中失败。
我如何收听手机的键盘而不是EditText字段中的更改?我不希望程序因为侦听器引起的无限循环而调用侦听器。
答案 0 :(得分:4)
附加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
相同答案 1 :(得分:1)
首先,我会创建一个文本更改侦听器,类似于SynchronizingWatcher
,并将其附加到EditText
。然后,当您收到文本更改事件时,在更新其他文本编辑之前,只需取消注册旧的侦听器,更新文本并再次启用侦听器:
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()
获取现有的密钥监听器,并将您的装饰器设置为{{1您的装饰者还会更新editText.setKeyListener()
中的其他编辑文本。但我会尽量避免弄乱那些东西。