Подтвердить что ты не робот

Прозрачная строка состояния, не работающая с 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" в своих макетах, но это не помогло решить проблему. Кто-нибудь знает, почему это происходит?

4b9b3361

Ответ 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

Чтобы достичь этого в любой деятельности

  1. Добавьте стиль:
 <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>
  1. Используйте CoordinatorLayout в качестве корневого макета в XML

  2. В методе oncreate() перед использованием setcontentview

    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE или View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN