Obsługa działań na klawiaturze

Gdy użytkownik zaznaczy edytowalny widok tekstu, taki jak EditText z podłączoną klawiaturą sprzętową, dane wejściowe są obsługiwane przez system. Jeśli jednak chcesz przechwycić lub samodzielnie obsługiwać wprowadzanie tekstu z klawiatury, możesz to zrobić, implementując metody wywołania zwrotnego z KeyEvent.Callback interfejsu, np. onKeyDown() i onKeyMultiple().

Zarówno Activity, a klasa View implementuje komponent KeyEvent.Callback. zwykle zastępują metody wywołania zwrotnego w rozszerzeniu tych klas, jak odpowiednie.

Uwaga: w przypadku obsługi zdarzeń klawiatury za pomocą makra klasa KeyEvent i powiązane interfejsy API, można oczekiwać, że zdarzenia dotyczące klawiatury pochodzą wyłącznie z klawiatury sprzętowej. Nigdy nie polegaj na kluczu odbierającym zdarzeń dla dowolnego klawisza przy użyciu programowej metody wprowadzania (klawiatury ekranowej).

Obsługa pojedynczych kluczowych zdarzeń

Aby obsługiwać pojedyncze naciśnięcie klawisza, zaimplementuj onKeyDown() lub onKeyUp(), w razie potrzeby. Zwykle należy użyć funkcji onKeyUp() jeśli chcesz mieć pewność, że otrzymasz tylko jedno zdarzenie. Po naciśnięciu i przytrzymaniu klawisza to funkcja onKeyDown() jest wywoływana wiele razy.

Na przykład ta implementacja reaguje na niektóre klawisze klawiatury w celu sterowania 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);
    }
}

Uchwyt klawiszy modyfikujących

Aby reagować na kluczowe zdarzenia modyfikujące, np. gdy klucz został połączony z Shiftem lub Control, możesz zapytanie KeyEvent która jest przekazywana do metody wywołania zwrotnego. Kilka metod podać informacje o klawiszach modyfikujących, takie jak getModifiers() i getMetaState(). Najprostszym rozwiązaniem jest jednak sprawdzenie, czy dokładny klawisz modyfikujący jest naciskany za pomocą takich metod jak isShiftPressed() i isCtrlPressed().

Oto przykładowa implementacja onKeyUp() z dodatkową obsługą w przypadku naciśnięcia klawisza Shift za pomocą jednego 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