Прозрачная строка состояния, не работающая с windowTranslucentNavigation = "false"
Я разрабатываю Activity
, где мне нужно сделать панель навигации непрозрачной, а строка состояния прозрачной для устройств с 5.0+ (API 21+). Ниже приведены стили, которые я использую, а также объяснение моей проблемы.
AppTheme
расширяет Theme.AppCompat.Light.NoActionBar
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/welbe_red_transparent</item>
FullscreenTheme
расширяет AppTheme
<item name="android:windowNoTitle">true</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:windowTranslucentNavigation">true</item>
Это делает приложение похожим на это
![android:windowTranslucentNavigation="true"]()
Если я удаляю стиль android:windowTranslucentNavigation
или устанавливаю его в false
в Fullscreen
, он исправляет проблему с навигационной панелью. Проблема заключается в том, что строка состояния становится полностью белой, а не остается прозрачной и отображает содержимое за ней.
![android:windowTranslucentNavigation="false"]()
Я пробовал использовать fitsSystemWindow="true"
в своих макетах, но это не помогло решить проблему. Кто-нибудь знает, почему это происходит?
Ответы
Ответ 1
android:windowTranslucentNavigation
делает то, что android:statusBarColor
не выполняет, запрашивая флаги SYSTEM_UI_FLAG_LAYOUT_STABLE
и SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
.
Это те, которые вам нужно запросить, чтобы оторваться от строки состояния.
Запросите их в onCreate
вашего Activity
:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
В качестве альтернативы вы также можете просто установить фон темы ваших приложений, а также появиться за панель состояния.
Подробнее здесь.
Ответ 2
Насколько я знаю, нет подходящего способа установить цвет строки состояния на API ниже 19.
Для API 19+ вы можете использовать аналогичный атрибут windowTranslucentNavigation
только для строки состояния:
<item name="android:windowTranslucentStatus">true</item>
Примечания:
-
Причина, по которой вы получали белую строку состояния, связана с
<item name="android:statusBarColor">@color/transparent</item>
-
Есть некоторые хаки, которые работают на определенных устройствах-производителях, но я бы не использовал их сам.
Ответ 3
Я борюсь с этим более 3 часов. Оберните все в CoordinatorLayout, это единственный, который, похоже, обращает внимание на fitsSystemWindow = "true" или "false"
Это мой основной фрагмент действия
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/layout_google_map"/>
<include layout="@layout/layout_toolbar_transparent"/>
<include layout="@layout/layout_action_buttons"/>
<include layout="@layout/layout_bottom_sheet"/>
</android.support.design.widget.CoordinatorLayout>
это мой макет панели инструментов
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:theme="@style/ToolbarTheme"
app:popupTheme="@style/AppTheme.PopupOverlay">
<android.support.v7.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="?actionBarSize"
android:layout_centerHorizontal="true"
android:layout_gravity="center"
android:adjustViewBounds="true"
app:srcCompat="@drawable/ic_fynd_logo_red"/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CoordinatorLayout>
как вы можете видеть, мой макет фрагмента делает карту google отображаемой в строке состояния.
У меня есть панель действий, где идет логотип компании.
И другие кнопки ui "layout_action_buttons" также завернуты в макет координатора, поэтому работает fitsSystemsWindows.
Проверьте это.
![введите описание изображения здесь]()
Ответ 4
![enter image description here]()
Чтобы достичь этого в любой деятельности
- Добавьте стиль:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/white</item>
</style>
-
Используйте CoordinatorLayout в качестве корневого макета в XML
-
В методе oncreate() перед использованием setcontentview
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE или View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN