Gestire le azioni della tastiera

Quando l'utente attiva una visualizzazione di testo modificabile, ad esempio un elementoEditText, e ha una tastiera hardware collegata, tutto l'input viene gestito dal sistema. Tuttavia, se vuoi intercettare o gestire direttamente l'input della tastiera, puoi farlo implementando metodi di callback dall'interfaccia KeyEvent.Callback, ad esempio onKeyDown() e onKeyMultiple().

Sia le classi Activity che View implementano l'interfaccia KeyEvent.Callback, quindi generalmente override i metodi di callback nell'estensione di queste classi, come è opportuno.

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 di tasti per qualsiasi tasto su un metodo di immissione soft (una tastiera sullo schermo).

Gestire singoli eventi chiave

Per gestire una singola pressione del tasto, implementa onKeyDown() o onKeyUp(), in base alle esigenze. Di solito, viene utilizzato onKeyUp() se vuoi assicurarti di ricevere un solo evento. Se l'utente preme 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);
    }
}

Gestire i tasti di modifica

Per rispondere agli eventi chiave dei modificatori, ad esempio quando un tasto è combinato con Maiusc o Ctrl, puoi eseguire query su KeyEvent, che viene passato al metodo di callback. Diversi metodi forniscono informazioni sui tasti di modifica, ad esempio getModifiers() e getMetaState(). Tuttavia, la soluzione più semplice è verificare se la tastiera modificata esatta che ti interessa è premuta con metodi come isShiftPressed() e isCtrlPressed().

Ad esempio, di seguito è riportata di nuovo l'implementazione di onKeyUp(), con una gestione aggiuntiva per quando 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