Obsługa odłączanych klawiatur pomaga zwiększyć 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łączana od niego, co może spowodować utratę stanu interfejsu. Aplikacja może albo zapisywać i przywracać swój stan, pozwalając systemowi na obsługę ponownego tworzenia aktywności, albo ograniczać ponowne tworzenie aktywności w przypadku zmian konfiguracji klawiatury.
We wszystkich przypadkach wszystkie dane związane z klawiaturą są przechowywane w Configuration
obiekcie. 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 wiąże się ze zmianami konfiguracji, którymi możesz zarządzać na 2 sposoby:
- Pozwól systemowi na ponowne utworzenie uruchomionej aktywności, a Ty zajmij się zarządzaniem stanem aplikacji.
- Samodzielnie zarządzaj zmianą konfiguracji (aktywność nie zostanie ponownie utworzona):
- Zadeklaruj wszystkie wartości konfiguracji związane z klawiaturą.
- Utwórz moduł obsługi zmian konfiguracji.
Aplikacje zwiększające produktywność, które często wymagają precyzyjnej kontroli interfejsu w przypadku wprowadzania tekstu i innych danych, mogą korzystać z samodzielnego podejścia do obsługi zmian konfiguracji.
W szczególnych przypadkach możesz chcieć zmienić układ aplikacji, gdy klawiatura sprzętowa jest podłączona lub odłączona, np. aby zwolnić więcej miejsca na narzędzia lub okna edycji.
W Jetpack Compose możesz reagować na zmiany konfiguracji klawiatury na 2 sposoby:
- Interfejs reaktywny: odczytuj bieżący stan konfiguracji bezpośrednio w elementach kompozycyjnych za pomocą
LocalConfiguration.current. Gdy klawiatura jest podłączona lub odłączona, interfejs automatycznie się przekomponowuje, aby dostosować się do nowego stanu. - Wywołanie zwrotne efektu ubocznego: użyj
DisposableEffectz uwzględnieniem cyklu życia, aby zarejestrować odbiornik zmian konfiguracji w aktywności hosta, co pozwoli Ci wywoływać zdarzenia niezwiązane z interfejsem (np. logowanie lub analizy) bez ponownego tworzenia aktywności ani tworzenia instancji elementów widoku zastępczego.
Składniki
android:configChanges: atrybut elementu<activity>w manifeście aplikacji. Informuje system o zmianach konfiguracji, którymi zarządza aplikacja.LocalConfiguration: lokalny dostawca kompozycyjny, który udostępnia bieżące urządzenieConfiguration.DisposableEffect: interfejs API efektu ubocznego Compose, który uruchamia blok kodu, gdy element kompozycyjny wchodzi w skład kompozycji, i czyści go, gdy z niej wychodzi.
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 elementu kompozycyjnego, lub zarejestruj odbiornik konfiguracji za pomocą DisposableEffect.
1. Zadeklaruj atrybut configChanges
Zaktualizuj element <activity> w manifeście aplikacji, dodając wartości
keyboard|keyboardHidden do listy już zarządzanych zmian konfiguracji
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Reaguj na zmiany konfiguracji klawiatury
Aby obsługiwać 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: interfejs reaktywny (zalecana)
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 przekomponowuje 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: odbiornik efektu ubocznego
Jeśli po zmianie konfiguracji musisz wykonać efekt uboczny (np. logowanie, aktualizowanie lokalnej bazy danych lub wywoływanie analiz), użyj
DisposableEffect, aby zarejestrować odbiornik zmian konfiguracji w aktywności hostaComponentActivity.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 zapisywać stan interfejsu aplikacji podczas zmian konfiguracji, takich jak podłączanie lub odłączanie klawiatury, przeczytaj artykuł Zapisywanie stanów interfejsu.