Обработка действий с клавиатурой

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как обрабатывать действия клавиатуры в 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);
    }
}

Обработка клавиш-модификаторов

Чтобы реагировать на события клавиш-модификаторов, например когда клавиша нажимается в сочетании с 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);
    }
}

Дополнительные ресурсы