Как в Android 15 и 16 поправлять макеты без Edge-To-Edge?

В Android 15 появилась фишка под названием edge-to-edge, когда окно раскрывается на всю область экрана, и накладываются поверх него статусбар, кнопки навигации и элементы управления, если нужно расположить в активную область, не перекрывая остальное. Такая опция доступна с выходом SDK 35 и 36 с переработкой.

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

1. Добавить атрибуты windowOptOutEdgeToEdgeEnforcement к Activity. Но это чисто заплатка, так как в Android 16 её уже посчитали устаревшим атрибутом. Следовательно, мы увидим только белый статусбар и незанятая область слева/справа в альбомной ориентации.

2. Применять WindowInsets Это самый универсальный способ, но подходить к нему надо аккуратно.

3. Добавлять fitsSystemWindows Не рекомендую, подойдет разве что для легаси-проектов и Android ниже чем 15.

Начнем со второго пункта - WindowInsets. Что нам нужно, чтобы поправлять макет через него?

1. Воспользоваться функцией View.setOnApplyWindowInsetsListener.

Эта функция отвечает за создание прослушки для изменения параметров окна - сколько нужно выделить отступа для статусбара, кнопок навигаций и вырезов, чтобы интерфейс не разъежался. Понабодятся всего лишь три инсета:

1. WindowInsets.Type.statusBars() для статусбаров. 2. WindowInsets.Type.displayCutout() для вырезов под экран; 3. WindowInsets.Type.navigationBars() для кнопок навигации.

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

2. Добавить View ниже активной области экрана Это можно рассматривать в качестве альтернативного варианта, но скорее пойдет, если нужно совмещать пустой View с WindowInsets для того, чтобы правильно закрасить фон кнопки навигации (пусть это выглядит как костыль)

3. Убрать слушатель в BottomNavigationView Это важно, чтобы лишний отступ не бросался в глаза, поскольку слушатель был установлен по умолчанию.

Таким образом можно адаптировать макеты и к различным версиям Android, не переживая о том, что могут быть различные неудобства (если, конечно, сами API для инсетов не переделают в Google).

#android #androidview #разработкамобильныхприложений

Как в Android 15 и 16 поправлять макеты без Edge-To-Edge? | Сетка — социальная сеть от hh.ru Как в Android 15 и 16 поправлять макеты без Edge-To-Edge? | Сетка — социальная сеть от hh.ru Как в Android 15 и 16 поправлять макеты без Edge-To-Edge? | Сетка — социальная сеть от hh.ru Как в Android 15 и 16 поправлять макеты без Edge-To-Edge? | Сетка — социальная сеть от hh.ru