在我当前的视图中,键盘打开,数字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;
}
我按下了键盘上的每一个键,结果如下:
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
无法识别这些密钥。有人得到了答案吗?
答案 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)。