当用户将焦点放在可修改的文本视图(例如 EditText
元素)上,并且已连接硬件键盘时,所有输入均由系统处理。不过,如果您想要拦截或直接自行处理键盘输入,可以通过从 KeyEvent.Callback
接口实现回调方法(例如 onKeyDown()
和 onKeyMultiple()
)完成此操作。
Activity
和 View
类都会实现 KeyEvent.Callback
接口,因此您通常应该根据具体情况在这些类的扩展中替换这些回调方法。
注意:在使用 KeyEvent
类和相关 API 处理键盘事件时,您应该会发现硬件键盘是此类键盘事件的唯一来源。切勿依赖接收软键盘输入法(屏幕键盘)中任何按键对应的按键事件。
处理单个按键事件
如需处理单个按键操作,请根据具体情况实现 onKeyDown()
或 onKeyUp()
。通常,如果您想要确保只接收一个事件,则应使用 onKeyUp()
。如果用户按住某个按键,系统会多次调用 onKeyDown()
。
例如,以下实现可以响应某些键盘按键以控制游戏:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_D -> { moveShip(MOVE_LEFT) true } KeyEvent.KEYCODE_F -> { moveShip(MOVE_RIGHT) true } KeyEvent.KEYCODE_J -> { fireMachineGun() true } KeyEvent.KEYCODE_K -> { fireMissile() true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_D: moveShip(MOVE_LEFT); return true; case KeyEvent.KEYCODE_F: moveShip(MOVE_RIGHT); return true; case KeyEvent.KEYCODE_J: fireMachineGun(); return true; case KeyEvent.KEYCODE_K: fireMissile(); return true; default: return super.onKeyUp(keyCode, event); } }
处理辅助键
如需响应辅助键事件(例如,将某个按键与 Shift 键或 Control 键结合使用),可以查询传递到回调方法的 KeyEvent
。有几种方法可以提供有关辅助键的信息,例如 getModifiers()
和 getMetaState()
。不过,最简单的解决方案是使用 isShiftPressed()
和 isCtrlPressed()
等方法检查您关注的确切辅助键是否已被按下。
例如,以下还是 onKeyUp()
实现,以及在 Shift 键与某个按键同时按住时需要进行的一些额外处理:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { ... KeyEvent.KEYCODE_J -> { if (event.isShiftPressed) { fireLaser() } else { fireMachineGun() } true } KeyEvent.KEYCODE_K -> { if (event.isShiftPressed) { fireSeekingMissle() } else { fireMissile() } true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { ... case KeyEvent.KEYCODE_J: if (event.isShiftPressed()) { fireLaser(); } else { fireMachineGun(); } return true; case KeyEvent.KEYCODE_K: if (event.isShiftPressed()) { fireSeekingMissle(); } else { fireMissile(); } return true; default: return super.onKeyUp(keyCode, event); } }
其他资源
- 键盘快捷键辅助工具:系统屏幕,可让用户搜索您的应用提供的键盘快捷键。