Obsługa działań na klawiaturze

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