ユーザーが編集可能なテキストビュー(EditText
要素など)にフォーカスを移し、ハードウェア キーボードが接続されている場合、すべての入力がシステムによって処理されます。ただし、キーボード入力をインターセプトまたは直接処理する場合は、KeyEvent.Callback
インターフェースからコールバック メソッド(onKeyDown()
や onKeyMultiple()
など)を実装することで実現できます。
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); } }
参考情報
- キーボード ショートカット ヘルパー : アプリが提供するキーボード ショートカットをユーザーが検索できるシステム画面。