Прозрачная панель навигации не прозрачна в режиме разделенного экрана

Приложение, над которым я работаю, использует прозрачные системные панели в версиях 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() чтобы получить верхнюю вставку.

Объединенные ценности работали для меня.

Другие вопросы по тегам