当用户将焦点放在可编辑文本视图(例如 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); } }
其他资源
- 键盘快捷键助手 :一个系统屏幕,允许用户搜索您的应用提供的键盘快捷键。