Gdy użytkownik skupi się na widoku tekstu, który można edytować, np. na elemencie EditText, i ma podłączoną klawiaturę sprzętową, wszystkie dane wejściowe są obsługiwane przez system. Jeśli jednak chcesz samodzielnie przechwytywać lub bezpośrednio obsługiwać 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 klasy Activity, jak i View implementują interfejs KeyEvent.Callback, więc zwykle 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 otrzymywaniu zdarzeń klawiatury dla żadnego klawisza w programowej metodzie wprowadzania (klawiatura ekranowa).
Obsługa pojedynczych zdarzeń klawiatury
Aby obsługiwać pojedyncze naciśnięcia klawiszy, zaimplementuj odpowiednio onKeyDown() lub onKeyUp(). Zwykle używasz 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.
Ta implementacja reaguje np. 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 klawiszy modyfikujących, np. gdy klawisz jest połączony z Shift
lub Control, możesz
wysyłać zapytania do KeyEvent
, który jest przekazywany do metody wywołania zwrotnego. Kilka metod zawiera informacje o klawiszach modyfikujących, np. getModifiers() i getMetaState().
Najprostszym rozwiązaniem jest jednak sprawdzenie, czy naciśnięty jest dokładnie ten klawisz modyfikujący, który Cię interesuje, za pomocą metod takich jak isShiftPressed() i isCtrlPressed().
Oto ponownie implementacja onKeyUp() z dodatkową obsługą sytuacji, gdy klawisz Shift jest przytrzymywany z 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
- Skróty klawiszowe: ekran systemowy, który umożliwia użytkownikom wyszukiwanie skrótów klawiszowych oferowanych przez Twoją aplikację.