Событие OnKey отправляется дважды, когда я набираю текст в текстовое поле.Как предотвратить? - PullRequest
2 голосов
/ 26 марта 2012

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

Спасибо

Ответы [ 2 ]

5 голосов
/ 26 марта 2012

Вы, вероятно, получаете оба события нажатия клавиш / нажатия клавиш.

Попробуйте отфильтровать свой метод, проверив действие KeyEvent для действия ACTION_UP.

Чтение this для получения дополнительной информации

2 голосов
/ 26 марта 2012

Вы получаете событие для нажатия клавиши вниз и клавиши вверх. Лучше прослушивать событие изменения текста вместо ключевого события

txtPhoneNumber.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, ....){
        //validation
    }
 });
...