Android - 为什么 onKeyUp 会触发 KeyEvent,但 onKeyDown 不会?

kei*_*bel 5 android key-events

在我当前的视图中,打开了一个键盘,其中包含数字 0 到 9、删除键和回车键。我添加了一个onKeyDown和 一个onKeyUp事件。按下时两者都应将键码记录到调试控制台。

@Override
public boolean onKeyDown(int pKeyCode, KeyEvent pKeyEvent) {
    Log.d("KEYDOWN", pKeyCode+"");
    return true; // also tried false
}
@Override
public boolean onKeyUp(int pKeyCode, KeyEvent pKeyEvent) {
    Log.d("KEYUP", pKeyCode+"");
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我按下键盘上的每个键,结果如下:

D/KEYUP: 8
D/KEYUP: 9
D/KEYUP: 10
D/KEYUP: 11
D/KEYUP: 12
D/KEYUP: 13
D/KEYUP: 14
D/KEYUP: 15
D/KEYUP: 16
D/KEYDOWN: 67
D/KEYUP: 67
D/KEYUP: 7
D/KEYUP: 66
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么 0-9 和 Enter 永远不会触发 keydown 事件吗?我真的需要它在按下 0-9 时触发。

编辑:我添加了一个解决方案,通过将这两个函数替换为dispatchKeyEvent. 但这并不能解释为什么 onKeyDown无法识别这些键。

有人对此有答案吗?

kei*_*bel 5

我只找到了解决此问题的解决方案,但我没有找到发生这种情况的原因。

这段代码完成了这项工作:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction()==KeyEvent.ACTION_DOWN) {
        Log.d("KEYDOWN", event.getKeyCode()+"");
    }
    else if (event.getAction()==KeyEvent.ACTION_UP) {
        Log.d("KEYUP", event.getKeyCode()+"");
    }
    Log.d("KEY", event.getKeyCode()+"");
    return false;
}
Run Code Online (Sandbox Code Playgroud)