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

usr*_*ΛΩΝ 2 android event-handling android-event

在我的调试会话期间,我发现了一件奇怪的事情.我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

好的我可以承认,当用户按下Enter键时再次执行验证是非常多余的,而不仅仅是关闭软键盘.但是我发现OnKey事件被调度了两次.

例如,我正在写作3551234567,我已经输入了355.当我按下1时,会触发一个事件v.getText()= = 355,然后另一个事件具有v.getText()= 3551.

我想知道这是否正常,如果可以通过区分这是"preOnKeyEvent"还是"postOnKeyEvent"来避免这种情况.事件之后我只需要字符串,而不是之前.

谢谢

Sav*_*sis 5

您可能同时获得了按键/按键事件.

尝试通过检查KeyEvent对ACTION_UP操作的操作来过滤您的方法.

阅读本文以获取更多信息