キーボード アクションの処理

ユーザーが 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 キーや Ctrl キーと組み合わせた修飾キーイベントに対応するには、コールバック メソッドに渡される KeyEvent をクエリします。いくつかのメソッドは、修飾キーに関する情報を提供します(getModifiers()getMetaState() など)。しかしながら、最も簡単な解決策は、isShiftPressed()isCtrlPressed() などのメソッドを使用して、目的の修飾キーが押されているかどうかを確認することです。

たとえば、次に再掲する onKeyDown() 実装の例には、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);
        }
    }