Прозрачная панель навигации не прозрачна в режиме разделенного экрана
Приложение, над которым я работаю, использует прозрачные системные панели в версиях Android, которые его поддерживают. Это достигается с помощью следующего определения в стиле:
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
И следующий код:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
/* Make system bars fully transparent */
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
В обычном режиме это работает, как и ожидалось: статус и панель навигации накладываются на контент приложения.
В режиме разделенного экрана это работает для строки состояния, но не для панели навигации: в портретном режиме, когда приложение находится внизу, панель навигации черная, но getWindow().getDecorView().getRootWindowInsets().getSystemWindowInsetBottom()
сообщает о вставке 144 пикселей. Высота вида декора на 144 пикселя меньше, чем у корневого вида (без разделенного экрана они оба равны, поскольку в приложении нет панели действий). Аналогичные симптомы в ландшафтном режиме, когда приложение находится справа (как панель навигации).
Добавление View.SYSTEM_UI_FLAG_LAYOUT_STABLE
Флаг не имеет никакого эффекта.
Устройство представляет собой смартфон, то есть устройство, которое по умолчанию установлено в портретном режиме и показывает боковую панель навигации в альбомном режиме.
Это ошибка в дистрибутиве Android, который я использую (LineageOS 15.1, Android 8.1.0), или я что-то упустил? Должна ли панель навигации быть прозрачной в режиме разделенного экрана? Если нет, как я могу надежно определить, какие части моего обзора будут скрыты системными панелями?
1 ответ
Поскольку у меня до сих пор нет объяснения представленных значений, я предполагаю, что это ошибка, присутствующая во многих (если не во всех) версиях Android.
Кроме того, предпочтительным способом получения оконных вставок, по-видимому, является переопределение onApplyWindowsInsets()
и оценить insets
переданный аргумент (который поддерживается начиная с API 20, тогда как для вышеуказанного способа требуется API 23). К сожалению, у этого, похоже, есть свои ошибки, а именно сообщение о неверных верхних вставках, но объединение двух результатов сработало для меня.
- Храните вставки, переданные
onApplyWindowsInsets()
, отбрасывая только верхний. - Используйте сохраненные значения и положитесь на
View#getRootWindowInsets()
чтобы получить верхнюю вставку.
Объединенные ценности работали для меня.