Gérer les actions du clavier

Essayer Compose
Jetpack Compose est le kit d'outils d'UI recommandé pour Android. Découvrez comment gérer les actions du clavier dans Compose.

Lorsque l'utilisateur place le curseur sur un affichage de texte modifiable, tel qu'un élément EditText, et qu'un clavier matériel est connecté, toutes les entrées sont gérées par le système. Toutefois, si vous souhaitez intercepter ou gérer directement la saisie au clavier, vous pouvez le faire en implémentant des méthodes de rappel à partir de l'interface KeyEvent.Callback, telles que onKeyDown() et onKeyMultiple().

Les classes Activity et View implémentent l'interface KeyEvent.Callback. Vous devez donc généralement remplacer les méthodes de rappel dans votre extension de ces classes, le cas échéant.

Remarque : Lorsque vous gérez des événements clavier avec la classe KeyEvent et les API associées, attendez-vous à ce que les événements clavier proviennent uniquement d'un clavier physique. Ne comptez jamais sur la réception d'événements clés pour une touche sur une méthode de saisie logicielle (un clavier à l'écran).

Gérer les événements de touche unique

Pour gérer une pression sur une touche individuelle, implémentez onKeyDown() ou onKeyUp(), selon le cas. En général, vous utilisez onKeyUp() si vous souhaitez vous assurer de ne recevoir qu'un seul événement. Si l'utilisateur appuie de manière prolongée sur une touche, onKeyDown() est appelé plusieurs fois.

Par exemple, cette implémentation répond à certaines touches du clavier pour contrôler un jeu :

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

Gérer les touches de modification

Pour répondre aux événements de touches de modification, par exemple lorsqu'une touche est combinée avec Maj ou Ctrl, vous pouvez interroger le KeyEvent qui est transmis à la méthode de rappel. Plusieurs méthodes fournissent des informations sur les touches de modification, telles que getModifiers() et getMetaState(). Toutefois, la solution la plus simple consiste à vérifier si la touche de modification exacte qui vous intéresse est enfoncée à l'aide de méthodes telles que isShiftPressed() et isCtrlPressed().

Par exemple, voici à nouveau l'implémentation de onKeyUp(), avec une gestion supplémentaire lorsque la touche Maj est maintenue enfoncée avec l'une des touches :

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

Ressources supplémentaires