Gérer les actions du clavier

Lorsque l'utilisateur donne la priorité à une vue de texte modifiable, comme un élément EditText, et qu'un clavier physique 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 remplacez donc généralement les méthodes de rappel dans votre extension de ces classes, le cas échéant.

Remarque:Lorsque vous gérez des événements de clavier avec la classe KeyEvent et les API associées, attendez-vous à ce que les événements de clavier ne proviennent que d'un clavier physique. Ne comptez jamais sur la réception d'événements de touche pour une touche d'une méthode de saisie logicielle (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 règle générale, 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 touche de modification, par exemple lorsqu'une touche est combinée à Maj ou Ctrl, vous pouvez interroger le KeyEvent 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