Twoja aplikacja świetnie działa na telefonach w orientacji pionowej, więc ograniczasz ją tylko do tej orientacji. Widzisz jednak możliwość zrobienia więcej na dużych ekranach w orientacji poziomej.
Jak to zrobić, aby aplikacja była ograniczona do orientacji pionowej na małych ekranach, ale na dużych ekranach można było korzystać z orientacji poziomej?
Sprawdzone metody
Najlepsze aplikacje uwzględniają preferencje użytkownika, takie jak orientacja urządzenia.
Wytyczne 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 złożone i rozłożone stany urządzeń składanych. Aplikacje powinny optymalizować układy i interfejsy użytkownika pod kątem różnych konfiguracji, a także zapisywać i przywracać stan podczas zmian konfiguracji.
Ten przepis to tymczasowe rozwiązanie – dodatek obsługi dużego ekranu. 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 manifeście aplikacji, które umożliwia określenie, jak aplikacja reaguje na zmiany orientacji urządzenia.Activity#setRequestedOrientation(): metoda, za pomocą której możesz zmienić orientację aplikacji w czasie działaniaLocalConfiguration: komponent lokalny, który udostępnia bieżąceConfigurationurządzenia, umożliwiając odczytywanie wymiarów ekranu w jednostkach dp.LaunchedEffect: utwórz interfejs API efektów ubocznych Compose, który uruchamia blok kodu, gdy zmieni się klucz (w tym przypadku gdy zmieni się konfiguracja).
Kroki
Włącz domyślną obsługę zmian orientacji w pliku manifestu aplikacji. Następnie w czasie działania aplikacji użyj Jetpack Compose, aby dynamicznie ograniczyć orientację do pionowej na małych ekranach (telefonach), a na dużych ekranach zezwolić na wszystkie orientacje.
1. Określanie ustawienia orientacji w pliku manifestu aplikacji
Możesz uniknąć deklarowania elementu screenOrientation w pliku manifestu aplikacji (w takim przypadku orientacja domyślnie przyjmuje wartość unspecified) lub ustawić orientację ekranu na fullUser. Jeśli użytkownik nie zablokował obracania opartego na czujnikach, aplikacja będzie obsługiwać wszystkie orientacje urządzenia.
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
Różnica między używaniem unspecified a fullUser jest niewielka, ale istotna. Jeśli nie zadeklarujesz wartości screenOrientation, system wybierze orientację, a zasady, których używa do jej określania, mogą się różnić w zależności od urządzenia. Z drugiej strony określenie fullUser matches
dokładniej odzwierciedla zachowanie zdefiniowane przez użytkownika na urządzeniu: jeśli użytkownik zablokował obracanie oparte na czujnikach, aplikacja dostosowuje się do jego preferencji; w przeciwnym razie system zezwala na dowolną z 4 możliwych orientacji ekranu (pionową, poziomą, pionową odwróconą lub poziomą odwróconą). Zobacz android:screenOrientation.
2. Dynamiczne ograniczanie orientacji w Compose
W Jetpack Compose możesz odczytywać bieżące wymiary ekranu w jednostkach dp w sposób reaktywny z LocalConfiguration.current i używać LaunchedEffect do aktualizowania orientacji aktywności, gdy tylko zmieni się konfiguracja.
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 pełna implementacja, którą można skompilować:
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, gdy zmienia się konfiguracja aplikacji, np. gdy aktywność jest zmieniana, 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ą one ponowne utworzenie aktywności, znajdziesz w artykule Obsługa zmian konfiguracji.
Wyniki
Aplikacja powinna teraz pozostawać 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 w uaktualnieniu aplikacji, tak aby obsługiwała wszystkie konfiguracje urządzeń, zapoznaj się z tymi materiałami: