Gestire le azioni della tastiera

Quando l'utente imposta lo stato attivo su una visualizzazione di testo modificabile, ad esempio un elemento EditText, e l'utente ha una tastiera hardware collegata, tutti gli input vengono gestiti dal sistema. Tuttavia, se vuoi intercettare o gestire direttamente l'input da tastiera, puoi implementare metodi di callback dall'interfaccia KeyEvent.Callback, come onKeyDown() e onKeyMultiple().

Entrambe le classi Activity e View implementano l'interfaccia KeyEvent.Callback, pertanto in genere sostituisci i metodi di callback nell'estensione di queste classi, a seconda dei casi.

Nota: quando gestisci gli eventi della tastiera con la classe KeyEvent e le API correlate, tieni presente che gli eventi della tastiera provengono solo da una tastiera hardware. Non fare mai affidamento sulla ricezione di eventi chiave per un tasto di un metodo di inserimento flessibile (una tastiera sullo schermo).

Gestire i singoli eventi chiave

Per gestire la pressione di un singolo tasto, implementa onKeyDown() o onKeyUp(), a seconda dei casi. In genere, utilizzi onKeyUp() se vuoi avere la certezza di ricevere un solo evento. Se l'utente tiene premuto e tiene premuto un tasto, onKeyDown() viene chiamato più volte.

Ad esempio, questa implementazione risponde ad alcuni tasti della tastiera per controllare un gioco:

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

Gestisci i tasti di modifica

Per rispondere agli eventi dei tasti di modifica, ad esempio quando un tasto viene combinato con Maiusc o Control, puoi eseguire una query sul KeyEvent che viene trasmesso al metodo di callback. Diversi metodi forniscono informazioni sui tasti di modifica, come getModifiers() e getMetaState(). Tuttavia, la soluzione più semplice consiste nel verificare se il tasto di modifica che ti interessa viene premuto con metodi come isShiftPressed() e isCtrlPressed().

Ad esempio, ecco di nuovo l'implementazione di onKeyUp(), con una gestione aggiuntiva per quando si tiene premuto il tasto Maiusc con uno dei tasti:

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