Адаптивные действия, которые можно и чего нельзя делать

Адаптивные приложения поддерживают отображение всех размеров: весь экран устройства, окна с изменяемым размером в многооконном режиме, книжную и альбомную ориентацию, сложенное и развернутое отображение складных устройств.

Краткий список параметров конфигурации и API позволяет создавать адаптивные приложения. Однако некоторые устаревшие настройки и API несовместимы с адаптивными приложениями, и их следует избегать.

Возможность изменения размера

Адаптивные приложения поддерживают возможность изменения размера приложения и многооконный режим.

Атрибут resizeableActivity элементов манифеста <activity> и <application> включает или отключает многооконный режим в Android 11 (уровень API 30) и более ранних версиях. В Android 12 (уровень API 31) и выше большие экраны поддерживают многооконный режим независимо от атрибута. Дополнительную информацию см. в разделе Поддержка многооконного режима .

✓ Делай

Предоставьте своему приложению возможность участвовать в многооконных и многозадачных сценариях, чтобы повысить производительность и удовлетворенность пользователей.

Установите resizeableActivity="true" если ваше приложение нацелено на уровни API ниже 24; в противном случае забудьте об этом — это true по умолчанию в Android 7.0 (уровень API 24) и выше.

✗ Не надо

Не устанавливайте resizeableActivity="false" для любого уровня API. Не исключайте свое приложение из вариантов использования, включающих многооконный режим.

Ориентация

Адаптивные приложения поддерживают книжную и альбомную ориентацию независимо от размера экрана или оконного режима.

Параметр манифеста screenOrientation ограничивает ориентацию активности.

✓ Делай

Удалите параметр screenOrientation из манифеста приложения.

Блокировка ориентации приложений не предотвращает изменение размера окна. Размер приложений изменяется, когда они переходят в многооконный режим, когда устройство складывается или разворачивается, а также когда изменяется размер окна произвольной формы. Ваше приложение должно поддерживать изменения размера окна независимо от настройки атрибута screenOrientation .

✗ Не надо

Не ограничивайте деятельностную направленность. Приложения, которые блокируют ориентацию, размещаются в почтовом ящике на устройствах с большим экраном и несовместимыми размерами окон.

Приложения в почтовом ящике могут быть менее заметны в Google Play для планшетов, складных устройств и устройств ChromeOS.

Соотношение сторон

Поскольку размеры экрана и окон различаются, меняются и их соотношения сторон — от высокого и узкого до квадратного, короткого и широкого.

Параметры манифеста minAspectRatio и maxAspectRatio ограничивают соотношение сторон вашего приложения жестко запрограммированными значениями.

✓ Делай

Адаптируйте свое приложение к дисплею независимо от его относительных размеров.

Удалите параметры minAspectRatio и maxAspectRatio из манифеста приложения. Или убедитесь, что размер вашего приложения можно изменить, а соотношение сторон позаботится само собой (см. раздел «Изменение размера» ).

✗ Не надо

Не пытайтесь контролировать относительные размеры вашего приложения. Если ваше приложение запускается на экране или в окне, соотношение сторон которого несовместимо с соотношением сторон приложения, ваше приложение является почтовым ящиком.

В Android 14 (уровень API 34) и более поздних версиях пользователи могут переопределить соотношение сторон приложения, чтобы расширить приложения в почтовом ящике и заполнить доступную область отображения. См. Режим совместимости устройств .

Размер окна

Оптимизация макетов для дисплеев разных размеров — центральная предпосылка адаптивного дизайна. Адаптивные приложения ориентированы на размер окна приложения, а не на размер экрана устройства. Когда приложение работает в полноэкранном режиме, окном приложения является экран устройства.

Классы размеров окон предоставляют систематический способ определения и классификации размера окна приложения. Адаптируйте свое приложение, меняя макеты по мере изменения класса размера окна вашего приложения.

✓ Делай

Оцените размер окна вашего приложения на основе классов размеров окон.

Чтобы определить класс размера окна, используйте функцию верхнего уровня currentWindowAdaptiveInfo() адаптивной библиотеки Compose Material 3. Дополнительные сведения см. в разделе Создание адаптивных приложений .

✗ Не надо

Не пренебрегайте полезностью определений классов размеров окон и встроенных API. Не используйте устаревшие API для расчета размера окна.

Устаревшие API

API старых платформ неправильно измеряют размер окна приложения; некоторые измеряют экран устройства, некоторые исключают декор системы.

✓ Делай

Используйте WindowManager#getCurrentWindowMetrics() и WindowMetrics#getBounds() чтобы получить размер окна приложения. Используйте WindowMetrics#getDensity() чтобы получить плотность отображения.

✗ Не надо

Не используйте следующие устаревшие API Display для определения размера окна:

  • getSize() : устарел в Android 11 (уровень API 30).
  • getMetrics() : устарел в Android 11 (уровень API 30).
  • getRealSize() : устарел в Android 12 (уровень API 31).
  • getRealMetrics() : устарел в Android 12 (уровень API 31).

Сочинить

Jetpack Compose предназначен для разработки адаптивного пользовательского интерфейса. Никакого XML, никаких файлов макета, никаких квалификаторов ресурсов. Только составные элементы без сохранения состояния на основе Kotlin, такие как Column , Row и Box , которые описывают ваш пользовательский интерфейс, и модификаторы, такие как offset , padding и size , которые добавляют поведение к элементам пользовательского интерфейса.

✓ Делай

Создайте с помощью Compose. Будьте в курсе последних функций и выпусков.

✗ Не надо

Не полагайтесь на устаревшие технологии. Не позволяйте вашему приложению устареть.

Адаптивная библиотека Compose Material 3

Библиотека Compose Material 3 Adaptive предоставляет компоненты и API, упрощающие разработку адаптивных приложений.

✓ Делай

Используйте следующие API, чтобы сделать ваше приложение адаптивным:

  • NavigationSuiteScaffold : переключение между панелью навигации и направляющей в зависимости от класса размера окна приложения.
  • ListDetailPaneScaffold : реализует канонический макет списка. Адаптирует макет к размеру окна приложения.
  • SupportingPaneScaffold : реализует канонический макет вспомогательной панели.
✗ Не надо

Не изобретайте велосипед. Не упустите возможность повысить производительность труда разработчиков, обеспечиваемую всеми библиотеками Jetpack Compose.

Макеты

Пользователи ожидают, что приложения будут максимально эффективно использовать доступное пространство дисплея за счет дополнительного контента или расширенных элементов управления.

Адаптивные приложения оптимизируют макеты на основе изменений дисплея, в частности, изменений размера окна приложения или изменений положения устройства.

✓ Делай

Изменяйте компоненты пользовательского интерфейса по мере изменения размера окна, чтобы максимально эффективно использовать доступное пространство дисплея. Например, замените нижнюю панель навигации, используемую в окнах компактных размеров, на вертикальную панель навигации в средних и расширенных окнах. Измените расположение диалоговых окон, чтобы они были доступны на всех дисплеях.

Организуйте контент по панелям, чтобы использовать многопанельные макеты, такие как детальный список и вспомогательную панель для динамического отображения контента.

✓ Делать: список и подробная информация о действиях, организованных в виде двух панелей.
✗ Не надо

Если вы не используете панели содержимого, не растягивайте элементы пользовательского интерфейса просто так, чтобы заполнить доступное пространство отображения. Длинные строки текста трудно читать. Растянутые кнопки выглядят неудачно. Если вы используете Modifier.fillMaxWidth , не думайте, что это правильное поведение для всех размеров дисплея.

✗ Не следует: макет растягивается до размера расширяющегося окна.

Устройства ввода

Пользователи используют сенсорные экраны не только для взаимодействия с приложениями.

Адаптивные приложения поддерживают внешние клавиатуры, мыши и стилусы, чтобы обеспечить более удобный пользовательский интерфейс и помочь пользователям работать более продуктивно в любых форм-факторах.

✓ Делай

Воспользуйтесь преимуществами встроенных функций платформы Android для навигации по вкладкам клавиатуры, а также щелчков мыши или трекпада, выбора и прокрутки. Опубликуйте сочетания клавиш вашего приложения в Помощнике по сочетаниям клавиш .

Используйте библиотеку Jetpack Material 3, чтобы пользователи могли писать в любой компонент TextField с помощью стилуса.

✗ Не надо

Не делайте альтернативные методы ввода невозможными. Не рассказывайте о проблемах доступности.

Краткое содержание

  • Создайте свое приложение с помощью Compose и адаптивной библиотеки Material 3.
  • Базовые макеты по классам размеров окон
  • Создание многопанельных макетов
  • Сделайте свое приложение изменяемым по размеру
  • Никогда не блокируйте ориентацию активности
  • Не ограничивайте соотношение сторон
  • Поддержка ввода, кроме сенсорного
  • Избегайте устаревших API

✓ Делайте то, что ожидают ваши пользователи: оптимизируйте свое приложение для разнообразия устройств, которыми люди пользуются каждый день.

✗ Не ждите . Начните сегодня!