Способ №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"