处理键盘操作

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

处理修饰键

要响应修饰键事件(例如,当某个键与 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);
    }
}

其他资源