2

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

谢谢

4

2 回答 2

5

您可能会同时获得按键按下/按键向上事件。

尝试通过检查 KeyEvent 的操作以获取 ACTION_UP 操作来过滤您的方法。

阅读本文了解更多信息

于 2012-03-25T21:39:11.260 回答
2

你会得到按键和按键的事件。最好听文本更改事件而不是关键事件

txtPhoneNumber.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, ....){
        //validation
    }
 });
于 2012-03-25T21:42:47.497 回答