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