Tastaturaktionen verarbeiten

Wenn der Nutzer den Fokus auf eine bearbeitbare Textansicht legt, z. B. ein EditText-Element, und eine Hardwaretastatur angeschlossen hat, wird die gesamte Eingabe vom System verarbeitet. Wenn Sie die Tastatureingabe jedoch selbst abfangen oder direkt verarbeiten möchten, können Sie Rückrufmethoden aus der KeyEvent.Callback-Schnittstelle implementieren, z. B. onKeyDown() und onKeyMultiple().

Sowohl die Activity- als auch die View-Klasse implementieren die KeyEvent.Callback-Schnittstelle. Daher überschreiben Sie in der Regel die Rückrufmethoden in der Erweiterung dieser Klassen.

Hinweis:Wenn Sie Tastaturereignisse mit der Klasse KeyEvent und den zugehörigen APIs verarbeiten, gehen Sie davon aus, dass die Tastaturereignisse nur von einer Hardwaretastatur stammen. Verlassen Sie sich niemals darauf, dass Sie Tastenereignisse für eine Taste einer Soft-Eingabemethode (Bildschirmtastatur) erhalten.

Einzelne Schlüsselereignisse verarbeiten

Wenn Sie eine einzelne Tastenaktivierung verarbeiten möchten, implementieren Sie onKeyDown() oder onKeyUp(). Normalerweise verwenden Sie onKeyUp(), wenn Sie sicherstellen möchten, dass Sie nur ein Ereignis erhalten. Wenn der Nutzer eine Taste gedrückt hält, wird onKeyDown() mehrmals aufgerufen.

Bei dieser Implementierung reagiert das Spiel beispielsweise auf einige Tasten der Tastatur:

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);
    }
}

Modifikatortasten verarbeiten

Wenn Sie auf Modifikatortastenereignisse reagieren möchten, z. B. wenn eine Taste mit der Umschalttaste oder der Strg-Taste kombiniert wird, können Sie KeyEvent abfragen, die an die Rückrufmethode übergeben wird. Es gibt mehrere Methoden, um Informationen zu Modifikatortasten wie getModifiers() und getMetaState() zu erhalten. Am einfachsten ist es jedoch, mithilfe von Methoden wie isShiftPressed() und isCtrlPressed() zu prüfen, ob der gewünschte Modifikatorschlüssel gedrückt wird.

Hier ist beispielsweise die onKeyUp()-Implementierung noch einmal, mit einer zusätzlichen Verarbeitung, wenn die Umschalttaste zusammen mit einer der Tasten gedrückt wird:

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);
    }
}

Weitere Informationen