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

Когда пользователь фокусирует внимание на редактируемом текстовом представлении, таком как элемент 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)
    }
}

Джава

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

Джава

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

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