キーボード アクションを処理する

ユーザーが 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);
    }
}

参考情報