Obsługa działań na klawiaturze

Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi do tworzenia interfejsu na Androidzie. Dowiedz się, jak obsługiwać działania klawiatury w Compose.

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ę.