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, tutto l'input viene gestito dal sistema. Tuttavia, se vuoi intercettare o gestire direttamente l'input da tastiera, puoi implementare i metodi di callback dall'interfaccia KeyEvent.Callback, come onKeyDown() e onKeyMultiple().

Entrambe le classi Activity e View implementano l'interfaccia KeyEvent.Callback, quindi in genere esegui l'override dei 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, prevedi che gli eventi della tastiera provengano solo da una tastiera hardware. Non fare mai affidamento sulla ricezione di eventi chiave per i tasti su un metodo di immissione software (una tastiera sullo schermo).

Gestire singoli eventi chiave

Per gestire una singola pressione dei tasti, implementa onKeyDown() o onKeyUp(), a seconda dei casi. In genere, utilizzi onKeyUp() se vuoi assicurarti di ricevere un solo evento. Se l'utente 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);
    }
}

Gestire i tasti di modifica

Per rispondere agli eventi dei tasti di modifica, ad esempio quando un tasto viene combinato con Maiusc o Ctrl, puoi eseguire una query sul valore KeyEvent che viene trasmesso al metodo di callback. Esistono diversi metodi che forniscono informazioni sui tasti di modifica, come getModifiers() e getMetaState(). Tuttavia, la soluzione più semplice consiste nel verificare se il tasto di modifica esatto 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 i casi in cui il tasto Maiusc viene tenuto premuto 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);
    }
}

Risorse aggiuntive