Zarządzanie odłączaną klawiaturą

Ikona oceny 3 gwiazdek

Obsługa odłączanych klawiatur pomaga zmaksymalizować produktywność użytkowników na urządzeniach z dużym ekranem. Android wywołuje zmianę konfiguracji za każdym razem, gdy klawiatura jest podłączana do urządzenia lub od niego odłączana, co może spowodować utratę stanu interfejsu. Aplikacja może zapisać i przywrócić swój stan, umożliwiając systemowi obsługę odtwarzania aktywności, lub ograniczyć odtwarzanie aktywności w przypadku zmian konfiguracji klawiatury.

We wszystkich przypadkach dane związane z klawiaturą są przechowywane w obiekcie Configuration. Pola keyboard i keyboardHidden obiektu konfiguracji zawierają informacje o typie klawiatury i jej dostępności.

Sprawdzone metody

Aplikacje zoptymalizowane pod kątem dużych ekranów obsługują wszystkie typy urządzeń wejściowych, od klawiatur programowych i sprzętowych po rysiki, myszy, trackpady i inne urządzenia peryferyjne.

Obsługa klawiatur zewnętrznych wymaga zmian w konfiguracji, którymi możesz zarządzać na 2 sposoby:

  1. Pozwól systemowi odtworzyć działającą aktywność i zajmij się zarządzaniem stanem aplikacji.
  2. Samodzielnie wprowadź zmiany w konfiguracji (aktywność nie zostanie utworzona ponownie):
    • Zadeklaruj wszystkie wartości konfiguracji związane z klawiaturą
    • Tworzenie modułu obsługi zmian konfiguracji

Aplikacje zwiększające produktywność, które często wymagają precyzyjnej kontroli nad interfejsem użytkownika w celu wprowadzania tekstu i innych danych, mogą skorzystać na podejściu „zrób to sam” do obsługi zmian konfiguracji.

W szczególnych przypadkach możesz zmienić układ aplikacji, gdy klawiatura sprzętowa jest podłączona lub odłączona, np. aby zrobić więcej miejsca na narzędzia lub okna edycji.

W Jetpack Compose możesz reagować na zmiany konfiguracji klawiatury na 2 sposoby:

  1. Reaktywny interfejs: odczytuj bieżący stan konfiguracji bezpośrednio w komponentach za pomocą LocalConfiguration.current. Interfejs automatycznie zmienia układ, aby dostosować się do nowego stanu po podłączeniu lub odłączeniu klawiatury.
  2. Wywołanie zwrotne efektu ubocznego: użyj komponentu DisposableEffect uwzględniającego cykl życia, aby zarejestrować detektor zmian konfiguracji w aktywności hosta. Pozwoli to wywoływać zdarzenia niezwiązane z interfejsem (takie jak logowanie czy analityka) bez konieczności ponownego tworzenia aktywności lub tworzenia instancji fikcyjnych elementów widoku.

Składniki

  • android:configChanges: atrybut elementu <activity> w manifeście aplikacji. Informuje system o zmianach konfiguracji, którymi zarządza aplikacja.
  • LocalConfiguration: dostawca lokalny, który można komponować i który udostępnia bieżące urządzenie Configuration.
  • DisposableEffect: interfejs API efektu ubocznego Compose, który uruchamia blok kodu, gdy element kompozycyjny wchodzi do kompozycji, i czyści go, gdy ją opuszcza.

Kroki

Zadeklaruj atrybut configChanges i dodaj wartości związane z klawiaturą, aby zapobiec ponownemu tworzeniu aktywności. Następnie użyj LocalConfiguration.current, aby dynamicznie dostosować układ Composable, lub zarejestruj detektor konfiguracji za pomocą DisposableEffect.

1. Zadeklaruj atrybut configChanges

Zaktualizuj element <activity> w pliku manifestu aplikacji, dodając wartości keyboard|keyboardHidden do listy zmian konfiguracji, którymi już zarządzasz:

<activity
      …
      android:configChanges="...|keyboard|keyboardHidden">

2. Reagowanie na zmiany konfiguracji klawiatury

Aby obsłużyć zmiany konfiguracji w Jetpack Compose, użyj jednej z tych opcji w zależności od tego, czy aktualizujesz interfejs, czy wykonujesz wywołanie zwrotne efektu ubocznego:

  • Opcja A. Reaktywny interfejs (zalecane)

    Odczytaj typ klawiatury bezpośrednio z LocalConfiguration.current. Gdy klawiatura sprzętowa jest podłączona lub odłączona, ta wartość się zmienia, a Compose automatycznie ponownie komponuje interfejs.

    val configuration = LocalConfiguration.current
    val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY
    
    if (isPhysicalKeyboardAttached) {
        // Render layout optimized for physical keyboard
    } else {
        // Render default layout
    }

  • Opcja B. Detektor efektów ubocznych

    Jeśli po zmianie konfiguracji musisz wywołać efekt uboczny (np. logowanie, aktualizowanie lokalnej bazy danych lub uruchamianie statystyk), użyj DisposableEffect, aby zarejestrować detektor zmian konfiguracji na hoście ComponentActivity.

    val context = LocalActivity.current
    DisposableEffect(context) {
        val activity = context as? ComponentActivity
        val listener = Consumer<Configuration> { newConfig ->
            val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY
            // Trigger non-UI actions, analytics, etc.
        }
        activity?.addOnConfigurationChangedListener(listener)
        onDispose {
            activity?.removeOnConfigurationChangedListener(listener)
        }
    }

Wyniki

Aplikacja będzie teraz reagować na podłączenie lub odłączenie klawiatury zewnętrznej bez ponownego tworzenia uruchomionej aktywności.

Dodatkowe materiały

Aby dowiedzieć się, jak zapisać stan interfejsu aplikacji podczas zmian konfiguracji, takich jak podłączenie lub odłączenie klawiatury, przeczytaj artykuł o zapisywaniu stanów interfejsu.