Gdy użytkownik nada fokus widokowi tekstu umożliwiającemu edycję, np. elementowi EditText
, a ma podłączoną klawiaturę sprzętową, system przejmuje wszystkie dane wejściowe. Jeśli jednak chcesz przechwycić lub bezpośrednio obsłużyć dane wejściowe z klawiatury, możesz to zrobić, implementując metody wywołania zwrotnego z interfejsu KeyEvent.Callback
, takie jak onKeyDown()
i onKeyMultiple()
.
Zarówno klasa Activity
, jak i klasa View
implementują interfejs KeyEvent.Callback
, więc w odpowiednich przypadkach zazwyczaj zastępujesz metody wywołania zwrotnego w rozszerzeniu tych klas.
Uwaga: podczas obsługi zdarzeń klawiatury za pomocą klasy KeyEvent
i powiązanych interfejsów API należy pamiętać, że zdarzenia klawiatury pochodzą tylko z klawiatury sprzętowej. Nigdy nie polegaj na odbieraniu zdarzeń związanych z klawiszami w miękkiej metodzie wprowadzania danych (klawiatura ekranowa).
Obsługa zdarzeń pojedynczego klawisza
Aby obsłużyć naciśnięcie pojedynczego klawisza, w odpowiednim miejscu zastosuj funkcję onKeyDown()
lub onKeyUp()
. Zwykle używasz parametru onKeyUp()
, jeśli chcesz mieć pewność, że otrzymasz tylko 1 zdarzenie. Jeśli użytkownik naciśnie i przytrzyma klawisz, funkcja onKeyDown()
zostanie wywołana kilka razy.
Na przykład ta implementacja reaguje na niektóre klawisze klawiatury, aby sterować grą:
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); } }
Obsługa klawiszy modyfikujących
Aby reagować na zdarzenia związane z klawiszami modyfikującymi, np. gdy klawisz jest używany w połączeniu z klawiszem Shift lub Control, możesz zapytać o KeyEvent
, który jest przekazywany do metody wywołania zwrotnego. Informacje o klawiszach modyfikujących, takich jak getModifiers()
i getMetaState()
, można uzyskać na kilka sposobów.
Najprostszym rozwiązaniem jest jednak sprawdzenie, czy naciśnięty jest odpowiedni klawisz modyfikujący za pomocą metod takich jak isShiftPressed()
i isCtrlPressed()
.
Oto na przykład implementacja onKeyUp()
z dodatkowym przetwarzaniem, gdy klawisz Shift jest przytrzymany przy jednym z klawiszy:
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); } }
Dodatkowe materiały
- Informacje o skrótach klawiszowych: ekran systemu, który umożliwia użytkownikom wyszukiwanie skrótów klawiszowych dostępnych w aplikacji.