Как в 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).