Ваше приложение отлично работает на телефонах в вертикальной ориентации, поэтому вы ограничили его использование только вертикальной ориентацией. Однако вы видите, что на больших экранах в альбомной ориентации можно сделать больше.
Как сделать так, чтобы на маленьких экранах приложение работало только в вертикальной ориентации, а на больших – в горизонтальной?
Рекомендации
Лучшие приложения учитывают предпочтения пользователей, например ориентацию устройства.
Согласно рекомендациям по обеспечению качества адаптивных приложений, они должны поддерживать все конфигурации устройств, в том числе портретную и альбомную ориентации, многооконный режим, а также сложенное и разложенное состояния складных устройств. Приложения должны оптимизировать макеты и пользовательские интерфейсы для разных конфигураций, а также сохранять и восстанавливать состояние при изменении конфигурации.
Это временное решение, которое позволяет частично поддерживать большие экраны. Используйте рецепт, пока не сможете улучшить приложение, чтобы оно полностью поддерживало все конфигурации устройств.
Ингредиенты
screenOrientation– настройка манифеста приложения, позволяющая указать, как приложение реагирует на изменение ориентации устройства.Activity#setRequestedOrientation()– метод, с помощью которого можно изменить ориентацию приложения во время выполнения.LocalConfiguration– локальный поставщик, который предоставляет доступ к текущемуConfigurationустройства и позволяет считывать размеры экрана в единицах dp.LaunchedEffect: API побочных эффектов Compose, который запускает блок кода, когда меняется ключ (в данном случае – когда меняется конфигурация).
Шаги
Включите обработку изменений ориентации по умолчанию в манифесте приложения. Затем во время выполнения используйте Jetpack Compose, чтобы динамически ограничить ориентацию до портретной на компактных экранах (телефонах), разрешив все ориентации на больших экранах.
1. Как задать ориентацию в манифесте приложения
Вы можете не указывать элемент screenOrientation в манифесте приложения (в этом случае ориентация по умолчанию будет unspecified) или задать для ориентации экрана значение fullUser. Если пользователь не заблокировал поворот экрана на основе данных датчиков, ваше приложение будет поддерживать все ориентации устройства.
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
Разница между использованием unspecified и fullUser невелика, но важна. Если вы не укажете значение screenOrientation, ориентацию выберет система. При этом правила, которые система использует для определения ориентации, могут различаться на разных устройствах. В то же время значение fullUser больше соответствует поведению, заданному пользователем для устройства: если пользователь заблокировал поворот экрана на основе данных датчиков, приложение следует его предпочтениям; в противном случае система разрешает любую из четырех возможных ориентаций экрана (книжную, альбомную, обратную книжную или обратную альбомную). Подробнее: android:screenOrientation.
2. Динамическое ограничение ориентации в режиме создания
В Jetpack Compose можно реактивно считывать текущие размеры экрана в единицах dp из LocalConfiguration.current и использовать LaunchedEffect для обновления ориентации Activity при каждом изменении конфигурации.
Если ширина или высота экрана меньше 600dp (что соответствует компактной точке останова для телефонов), ограничьте ориентацию экрана вертикальной. В противном случае разрешите системе поворачивать приложение в соответствии с предпочтениями пользователя (unspecified или fullUser).
Вот полный код, который можно скомпилировать:
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 } }
Добавив логику в блок LaunchedEffect(configuration), вы сможете реактивно переопределять настройку ориентации при каждом изменении конфигурации приложения, например при изменении размера окна, перемещении между экранами или складывании и раскладывании складного устройства.
Подробнее о том, когда происходят изменения конфигурации и когда они приводят к воссозданию действий, можно узнать в разделе Обработка изменений конфигурации.
Результаты
Теперь приложение будет оставаться в вертикальной ориентации на маленьких экранах независимо от поворота устройства. На больших экранах приложение должно поддерживать как горизонтальную, так и вертикальную ориентацию.
Дополнительные ресурсы
Чтобы узнать, как обновить приложение, чтобы оно поддерживало все конфигурации устройств, ознакомьтесь со следующими материалами: