在调试会话中,我发现发生了一件奇怪的事情。我有一个EditText
控件,我将其当前活动定义为OnKeyListener
,以便在用户键入时执行验证。
代码
txtPhoneNumber.setOnEditorActionListener(this);
txtPhoneNumber.setOnKeyListener(this);
txtPhoneNumber.setOnFocusChangeListener(this);
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
String phoneNumber = ((TextView) v).getText().toString();
if (phoneNumber != null && !"".equals(phoneNumber))
setValidPhoneNumber(checkValidPhoneNumber(phoneNumber));
setForwardButtonEnabled(this.validPhoneNumber && this.readyToGo);
if (actionId == EditorInfo.IME_ACTION_DONE) {
InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
return false;
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
String phoneNumber = ((TextView) v).getText().toString();
if (phoneNumber != null && !"".equals(phoneNumber))
setValidPhoneNumber(checkValidPhoneNumber(phoneNumber));
setForwardButtonEnabled(this.validPhoneNumber && this.readyToGo);
return false;
}
好吧,我可以承认,当用户按下Enter键时,再次执行验证是非常多余的,而不仅仅是关闭软键盘。然而,我发现OnKey事件被调度了两次。
例如,我正在编写3551234567
,并且我已经键入了355
。当我按下1时,一个事件被触发,v.getText()
=355
,下一个事件的v.getText()
=3551
。
我想知道这是否正常,以及是否可以通过区分这是"preOnKeyEvent"还是"postOnKeyEvent"来避免这种情况。我只需要事件之后的字符串,而不需要之前的。
感谢
您可能同时获得了key-down/key-up事件。
请尝试通过检查KeyEvent的操作以查找action_UP操作来筛选方法。
阅读此以获取更多信息
您将获得按键向下和按键向上的事件。与其听关键事件,不如听文本更改事件
txtPhoneNumber.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, ....){
//validation
}
});