во время моих сеансов отладки я обнаружил странную вещь, происходящую.У меня есть элемент управления 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".Мне нужна только строка после события, а не до .
Спасибо