Когда пользователь фокусируется на редактируемом текстовом поле, например, на элементе 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); } }
Дополнительные ресурсы
- Вспомогательная панель сочетаний клавиш : Системный экран, позволяющий пользователям искать сочетания клавиш, предлагаемые вашим приложением.
