Gdy użytkownik włączy edytowalny widok tekstu, np. element EditText
, i ma dołączoną klawiaturę sprzętową, wszystkie dane wejściowe będą obsługiwane przez system. Jeśli jednak chcesz samodzielnie przechwycić dane wejściowe z klawiatury lub wykonać to działanie bezpośrednio, możesz to zrobić, implementując metody wywołania zwrotnego z interfejsu KeyEvent.Callback
, np. onKeyDown()
i onKeyMultiple()
.
Zarówno klasy Activity
, jak i View
implementują interfejs KeyEvent.Callback
, więc w stosownych przypadkach metody wywołania zwrotnego w rozszerzeniu tych klas są zwykle zastępowane.
Uwaga: w przypadku obsługi zdarzeń klawiatury za pomocą klasy KeyEvent
i powiązanych interfejsów API pamiętaj, że zdarzenia z klawiatury są wywoływane tylko z klawiatury sprzętowej. Nie licz na zdarzenia klawiszy, które zostaną użyte w przypadku metody programowego wprowadzania danych (klawiatury ekranowej).
Obsługa pojedynczych kluczowych zdarzeń
Aby obsłużyć naciśnięcie danego klawisza, zaimplementuj odpowiednio onKeyDown()
lub onKeyUp()
. Zwykle używaj parametru onKeyUp()
, jeśli chcesz mieć pewność, że otrzymasz tylko jedno zdarzenie. Jeśli użytkownik naciśnie i przytrzyma klawisz, funkcja onKeyDown()
zostanie wywołana wiele razy.
Ta implementacja odpowiada na przykład na klawisze na klawiaturze, by 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 odpowiedzieć na kluczowe zdarzenia modyfikujące, np. połączenie klucza z Shift lub Control, możesz wysłać zapytanie do obiektu KeyEvent
przekazywanego do metody wywołania zwrotnego. Informacje o kluczach modyfikujących można uzyskać, korzystając z kilku metod, np. getModifiers()
i getMetaState()
.
Najprostszym rozwiązaniem jest jednak sprawdzenie, czy naciśnięty klawisz modyfikujący, na którym Ci zależy, jest naciśnięty za pomocą metod takich jak isShiftPressed()
i isCtrlPressed()
.
Oto ponownie przykład implementacji onKeyUp()
z dodatkową obsługą w przypadku przytrzymania klawisza Shift za pomocą jednego z kluczy:
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
- Pomoc do skrótów klawiszowych : ekran systemowy, który umożliwia użytkownikom wyszukiwanie skrótów klawiszowych dostępnych w aplikacji.