当我在文本框中键入一些文本时,OnKey事件被调度了两次.如何预防



在调试会话中,我发现发生了一件奇怪的事情。我有一个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
    }
 });

相关内容

  • 没有找到相关文章

最新更新