处理键盘操作

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

当用户聚焦到可编辑文本视图(例如 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);
    }
}

处理修饰键

要响应修饰键事件,例如某个键与 ShiftControl 结合使用时,您可以查询传递给回调方法的 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);
    }
}

其他资源