Android - 为什么onKeyUp会触发KeyEvent,但onKeyDown却没有?

时间:2016-10-17 16:10:02

标签: android key-events

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

@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;
}

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

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

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

  

编辑:我添加了一个解决方案,通过将dispatchKeyEvent替换为两个函数来解决问题。这并不能解释原因   但是,onKeyDown无法识别这些密钥。

     

有人得到了答案吗?

2 个答案:

答案 0 :(得分:1)

我只找到了解决这个问题的解决方案,但我没有找到为什么会出现这种情况的原因。

此代码完成了这项工作:

@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;
}

答案 1 :(得分:1)

要了解您需要在代码中稍微深入一下的工作流程,它不是那么明显,但仍然如此。您的具体情况取决于您要扩展的视图和IME。来自docs

  

通常,框架不能保证它传递给视图的关键事件总是构成完整的键序列,因为某些事件可能在传递之前通过包含视图而被删除或修改。视图实现应该准备好处理FLAG_CANCELED并且应该容忍异常情况,例如在没有收到先前按键的ACTION_UP的情况下接收新的ACTION_DOWN。

您可以使用TextWatcher - 这是一个很好的解决方案,但我不了解您的需求。在任何情况下,如果你覆盖onKeyDown - 它将被触发,你需要自己处理它或调用父实现。在EditText的情况下 - form do |f| f.inputs "User" do f.input :name f.has_many :addresses, allow_destroy: true do |b| b.input :street b.input :number b.input :complement end end end 将由TextView处理,尽管很少(Back Button)。