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

Попробуйте способ создания композиций.
Jetpack Compose — это рекомендуемый набор инструментов для создания пользовательского интерфейса для Android. Узнайте, как обрабатывать действия клавиатуры в Compose.

Когда пользователь фокусируется на редактируемом текстовом поле, например, на элементе EditText , и у него подключена аппаратная клавиатура, весь ввод обрабатывается системой. Однако, если вы хотите перехватывать или обрабатывать ввод с клавиатуры самостоятельно, вы можете сделать это, реализовав методы обратного вызова из интерфейса KeyEvent.Callback , такие как onKeyDown() и onKeyMultiple() .

Классы Activity и View реализуют интерфейс KeyEvent.Callback , поэтому методы обратного вызова обычно переопределяются в расширениях этих классов по мере необходимости.

Примечание: При обработке событий клавиатуры с помощью класса KeyEvent и связанных API следует ожидать, что события клавиатуры поступают только с аппаратной клавиатуры. Никогда не полагайтесь на получение событий нажатия клавиш для любых клавиш, вводимых программным способом (экранной клавиатурой).

Обработка событий, связанных с одной клавишей.

Для обработки отдельного нажатия клавиши реализуйте метод onKeyDown() или onKeyUp() в зависимости от ситуации. Обычно onKeyUp() используется, если необходимо гарантировать получение только одного события. Если пользователь нажимает и удерживает клавишу, то onKeyDown() вызывается несколько раз.

Например, эта реализация реагирует на некоторые клавиши клавиатуры для управления игрой:

Котлин

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 удерживается одной из других клавиш:

Котлин

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);
    }
}

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