У меня есть приложение Android, в теме которого указаны следующие настройки:
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
Вид сверху в иерархии переопределяет onApplyWindowsInsets()
.Реализация просто записывает WindowInsets
, которое было передано, затем вызывает метод суперкласса, регистрирует результат и возвращает его - ничего не изменяется.Журнал также показывает, что метод суперкласса не изменяет вставки.
Теперь я получаю странный верхний вкладыш, который всегда кажется на 56–72 дп больше, чем я ожидал:
Platform DPI Layout Inset Bar Difference
Android x86_64 8.1 MDPI Landscape 88 px/dp 24 px/dp 64 px/dp
Landscape, split 80 px/dp 24 px/dp 56 px/dp
Anbox MDPI Window 64 px/dp None 64 px/dp
LineageOS 15.1 XXHDPI Portrait 240 px/80 dp 72 px/24 dp 168 px/56 dp
Portrait, split/top 216 px/73 dp 72 px/24 dp 144 px/48 dp
Portrait, split/bottom 144 px/48 dp None 144 px/48 dp
SDK Emulator (6.0) HDPI Portrait 120 px/80 dp 36 px/24 dp 84 px/56 dp
Примечание: в ландшафтном режиме два последовательных вызова onApplyWindowInsets()
выполняются два раза, здесь сообщаются только последние.
Вид фактически не выходит за пределы верхней частиЧто видно: если я нарисую область размером 24 пикселя в верхней части моего обзора, она появится в верхней части видимой области (т. е. под строкой состояния, если она есть), а не за пределами экрана.
Если бы я доверял этим значениям врезки и смещению содержимого на количество пикселей, указанное для того, чтобы он оставался свободным от системных панелей, я бы закончил с пропуском в верхней части представления.
Влево / вправоНасколько я могу судить, значения / bottom кажутся нормальными.
Как я могу это исправить?Я что-то пропускаю?