ユーザーが EditText
要素などの編集可能なテキストビューにフォーカスを合わせ、ユーザーがハードウェア キーボードを接続している場合、入力はすべてシステムによって処理されます。ただし、キーボード入力をインターセプトしたい場合または直接処理したい場合は、onKeyDown()
や onKeyMultiple()
などの KeyEvent.Callback
インターフェースからのコールバック メソッドを実装すれば実現できます。
Activity
クラスと View
クラスはどちらも KeyEvent.Callback
インターフェースを実装しているため、通常はこれらのクラスの拡張クラス内でコールバック メソッドを適切にオーバーライドする必要があります。
注: KeyEvent
クラスと関連 API でキーボード イベントを処理する場合、キーボード イベントはハードウェア キーボードからのみ発生すると想定してください。ソフト入力方法(画面キーボード)では、どのキーについてもキーイベントの受信に依存しないようにしてください。
単一のキーイベントの処理
キー操作を個別に処理するには、必要に応じて onKeyDown()
または onKeyUp()
を実装します。通常、1 つのイベントだけを確実に受信するには、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 キーが別のキーの 1 つと一緒に押されたときの処理が追加されています。
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); } }
参考情報
- キーボード ショートカット ヘルパー: ユーザーがアプリで提供されているキーボード ショートカットを検索できるシステム画面。