处理键盘操作

试试 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中处理键盘操作。

当用户将焦点放在可修改的文本视图(例如 EditText 元素)上,并且已连接硬件键盘时,所有输入均由系统处理。不过,如果您想要拦截或直接自行处理键盘输入,可以通过从 KeyEvent.Callback 接口实现回调方法(例如 onKeyDown()onKeyMultiple())完成此操作。

ActivityView 类都会实现 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);  } }

其他资源