Twoja aplikacja działa świetnie na telefonach w orientacji pionowej, więc ograniczasz jej działanie tylko do tej orientacji. Widzisz jednak możliwość zrobienia czegoś więcej na dużych ekranach w orientacji poziomej.
Jak można to połączyć – ograniczyć aplikację do orientacji pionowej na małych ekranach, ale umożliwić orientację poziomą na dużych?
Sprawdzone metody
Najlepsze aplikacje uwzględniają preferencje użytkownika, takie jak orientacja urządzenia.
Wskazówki dotyczące jakości aplikacji adaptacyjnych zalecają, aby aplikacje obsługiwały wszystkie konfiguracje urządzeń, w tym orientację pionową i poziomą, tryb wielu okien oraz stany złożone i rozłożone urządzeń składanych. Aplikacje powinny optymalizować układy i interfejsy użytkownika pod kątem różnych konfiguracji oraz zapisywać i przywracać stan podczas zmian konfiguracji.
Ten przepis to tymczasowe rozwiązanie – szczypta obsługi dużych ekranów. Korzystaj z tego przepisu, dopóki nie ulepszysz aplikacji, aby w pełni obsługiwała wszystkie konfiguracje urządzeń.
Składniki
screenOrientation: ustawienie w pliku manifestu aplikacji, które pozwala określić, jak aplikacja ma reagować na zmiany orientacji urządzenia.Activity#setRequestedOrientation(): metoda, za pomocą której możesz zmienić orientację aplikacji w czasie działania.LocalConfiguration: dostawca lokalny funkcji kompozycyjnej, który udostępnia bieżące urządzenieConfiguration, umożliwiając odczytywanie wymiarów ekranu w DP.LaunchedEffect: interfejs API efektu ubocznego Compose, który uruchamia blok kodu, gdy klucz ulega zmianie (w tym przypadku, gdy zmienia się konfiguracja).
Kroki
Włącz obsługę zmian orientacji przez aplikację domyślnie w pliku manifestu aplikacji. Następnie w czasie działania użyj Jetpack Compose, aby dynamicznie ograniczyć orientację do pionowej na ekranach kompaktowych (telefonach), jednocześnie zezwalając na wszystkie orientacje na dużych ekranach.
1. Określanie ustawienia orientacji w pliku manifestu aplikacji
Możesz nie deklarować elementu screenOrientation w pliku manifestu aplikacji (w takim przypadku orientacja domyślnie będzie ustawiona na unspecified) lub ustawić orientację ekranu na fullUser. Jeśli użytkownik nie zablokował obracania na podstawie czujnika, aplikacja będzie obsługiwać wszystkie orientacje urządzenia.
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
Różnica między użyciem unspecified i fullUser jest subtelna, ale ważna. Jeśli nie zadeklarujesz wartości screenOrientation, system wybierze orientację, a zasady, których używa do jej określenia, mogą się różnić w zależności od urządzenia. Z drugiej strony określenie fullUser lepiej odpowiada zachowaniu zdefiniowanemu przez użytkownika na urządzeniu: jeśli użytkownik zablokował obracanie na podstawie czujnika, aplikacja będzie postępować zgodnie z preferencjami użytkownika. W przeciwnym razie system zezwoli na dowolną z 4 możliwych orientacji ekranu (pionową, poziomą, odwróconą pionową lub odwróconą poziomą). Zobacz: android:screenOrientation.
2. Dynamiczne ograniczanie orientacji w Compose
W Jetpack Compose możesz odczytywać bieżące wymiary ekranu w DP reaktywnie z LocalConfiguration.current i używać LaunchedEffect do aktualizowania orientacji aktywności przy każdej zmianie konfiguracji.
Jeśli szerokość lub wysokość ekranu jest mniejsza niż 600dp (co odpowiada kompaktowemu punktowi przerwania w przypadku telefonów), ogranicz orientację do pionowej. W przeciwnym razie zezwól systemowi na obracanie aplikacji zgodnie z preferencjami użytkownika (unspecified lub fullUser).
Oto kompletna, możliwa do skompilowania implementacja:
val configuration = LocalConfiguration.current val context = LocalActivity.current LaunchedEffect(configuration) { val activity = context ?: return@LaunchedEffect // Determine if screen is compact (phone-sized) in either width or height val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600 activity.requestedOrientation = if (isCompact) { ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } else { ActivityInfo.SCREEN_ORIENTATION_FULL_USER } }
Dodając logikę w bloku LaunchedEffect(configuration), możesz reaktywnie zastępować ustawienie orientacji za każdym razem, gdy zmienia się konfiguracja aplikacji, np. gdy zmienia się rozmiar aktywności, gdy jest ona przenoszona między wyświetlaczami lub gdy urządzenie składane jest składane lub rozkładane.
Więcej informacji o tym, kiedy zachodzą zmiany konfiguracji i kiedy powodują ponowne utworzenie aktywności, znajdziesz w artykule Obsługa zmian konfiguracji.
Wyniki
Aplikacja powinna teraz pozostać w orientacji pionowej na małych ekranach niezależnie od obrotu urządzenia. Na dużych ekranach aplikacja powinna obsługiwać orientację poziomą i pionową.
Dodatkowe materiały
Aby uzyskać pomoc dotyczącą uaktualniania aplikacji, aby obsługiwała wszystkie konfiguracje urządzeń przez cały czas, zapoznaj się z tymi artykułami: