Gérer les actions du clavier

Lorsque l'utilisateur place le curseur sur une vue de texte modifiable, telle qu'un élément EditText, et qu'un clavier physique y 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 de clavier avec la classe KeyEvent et les API associées, attendez-vous à ce qu'ils proviennent uniquement d'un clavier physique. Ne comptez jamais sur la réception d'événements de touche pour une touche avec un mode de saisie virtuel (un clavier à l'écran).

Gérer des événements de touche unique

Pour gérer une pression individuelle sur une touche, implémentez onKeyDown() ou onKeyUp(), selon le cas. Généralement, utilisez onKeyUp() si vous souhaitez vous assurer de ne recevoir qu'un seul événement. Si l'utilisateur appuie sur une touche de manière prolongée, 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 à des événements de touche de modification, par exemple lorsqu'une touche est combinée avec Maj ou Ctrl, vous pouvez interroger l'KeyEvent transmise à la méthode de rappel. Plusieurs méthodes fournissent des informations sur les touches de modification, telles que getModifiers() et getMetaState(). Cependant, la solution la plus simple consiste à vérifier si l'utilisateur appuie sur la touche de modification exacte qui vous intéresse à 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