Способ №1:
Чтобы получить полностью прозрачную строку состояния, вы должны использовать statusBarColor, что доступно только в API 21 и выше. windowTranslucentStatusдоступен в API 19 и выше, но добавляет тонированный фон для строки состояния. Тем не менее, установка windowTranslucentStatusделает достичь одну вещь , которая меняется statusBarColorна прозрачный не делает: он устанавливает SYSTEM_UI_FLAG_LAYOUT_STABLE
и SYSTEM_UI_FLAG_LAYOUT_FULLSCREENфлаги. Самый простой способ добиться того же эффекта - установить эти флаги вручную, что эффективно отключает вставки, налагаемые системой макета Android, и оставляет вас на произвол судьбы.
Вы вызываете эту строку в своем onCreateметоде:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Не забудьте также установить прозрачность в /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
Или программно установите прозрачность:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Хорошая сторона этого подхода заключается в том, что те же макеты и конструкции можно использовать и в API 19, заменив прозрачную строку состояния тонированной полупрозрачной строкой состояния.
<item name="android:windowTranslucentStatus">true</item>
Способ №2:
Если вам нужно только нарисовать фоновое изображение под строкой состояния, вместо того, чтобы размещать представление за ним, это можно сделать, просто установив фон темы вашего действия на желаемое изображение и установив прозрачность строки состояния, как показано в методе # 1. Это был метод, который я использовал для создания снимков экрана для статьи об Android Police, опубликованной несколько месяцев назад.
Способ №3:
Если вам нужно игнорировать стандартные системные вставки для одних макетов, сохраняя их работоспособность в других, единственный жизнеспособный способ сделать это - работать с часто связываемым ScrimInsetsFrameLayoutклассом. Конечно, некоторые вещи, выполняемые в этом классе, необходимы не для всех сценариев. Например, если вы не планируете использовать наложение синтетической строки состояния, просто закомментируйте все в init()методе и не добавляйте ничего в файл attrs.xml. Я видел, как этот подход работает, но я думаю, вы обнаружите, что он имеет некоторые другие последствия, которые, возможно, потребует много работы.
Я также заметил, что вы против упаковки нескольких макетов. В случае обертывания одного макета внутри другого, когда оба имеют match_parentвысоту и ширину, последствия для производительности слишком тривиальны, чтобы о них беспокоиться. Тем не менее, вы можете полностью избежать этой ситуации, изменив класс, из которого он расширяется, FrameLayoutна любой другой тип класса Layout, который вам нравится. Он будет работать нормально.
android:fitsSystemWindows="true"