Processar ações do teclado

Quando o usuário focaliza uma visualização de texto editável, como um elemento EditText, e tem um teclado de hardware conectado, toda a entrada é processada pelo sistema. No entanto, se você quiser interceptar ou processar diretamente a entrada do teclado, implemente métodos de callback na interface KeyEvent.Callback, como onKeyDown() e onKeyMultiple().

As classes Activity e View implementam a interface KeyEvent.Callback, então você geralmente substitui os métodos de callback na extensão dessas classes, conforme adequado.

Observação:ao processar eventos de teclado com a classe KeyEvent e as APIs relacionadas, espere que os eventos de teclado sejam originados apenas de um teclado físico. Nunca confie no recebimento de eventos de tecla para qualquer tecla em um método de entrada simples (um teclado na tela).

Processar eventos de tecla única

Para processar um pressionamento de tecla individual, implemente onKeyDown() ou onKeyUp(), conforme apropriado. Normalmente, use onKeyUp() se quiser garantir que você receba apenas um evento. Se o usuário tocar em uma tecla e a mantiver pressionada, onKeyDown() será chamado várias vezes.

Por exemplo, esta implementação responde a algumas teclas do teclado para controlar um jogo:

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

Processar teclas modificadoras

Para responder a eventos de tecla modificadora, como quando uma tecla é combinada com Shift ou Control, consulte o KeyEvent transmitido para o método de callback. Vários métodos fornecem informações sobre teclas modificadoras, como getModifiers() e getMetaState(). No entanto, a solução mais simples é verificar se a tecla modificadora exata está sendo pressionada com métodos como isShiftPressed() e isCtrlPressed().

Por exemplo, veja a implementação de onKeyUp() novamente, com um processamento extra para quando a tecla Shift é pressionada com uma das teclas:

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