Obsługa działań na klawiaturze

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()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()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