Obsługa działań na klawiaturze

Wypróbuj tworzenie wiadomości
Jetpack Compose to zalecany zestaw narzędzi interfejsu na Androida. Dowiedz się, jak obsługiwać działania klawiatury w edytorze.

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 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 klucz modyfikujący, który Cię interesuje, za pomocą metod takich jak isShiftPressed()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