在我的调试会话中,我发现发生了一件奇怪的事情。我有一个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”来避免这种情况。我只需要事件之后的字符串,而不是之前的.
谢谢