Строка состояния становится белой и не отображает содержимое за ней


Я пробую AppCompat на зефир. И я хочу иметь прозрачную строку состояния, однако она становится белой. Я пробовал несколько решений, но они не работали для меня (прозрачная строка состояния не работает с windowTranslucentNavigation="false", Lollipop : draw behind statusBar с его цветом, установленным на прозрачный). Вот соответствующий код.

мои стили.XML

<style name="Bacon" parent="Theme.Bacon"/>

<style name="Theme.Bacon" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@color/background_material_light</item>  
</style>

<style name="Theme.Bacon.Detail" parent="Bacon"/>

v21

<style name="Bacon" parent="Theme.Bacon">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

<style name="Theme.Bacon.Detail" parent="Bacon">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

активность

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

</FrameLayout>

фрагмент

<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.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="32dp"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/black_trans80">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/photo"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/anim_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

20 61

20 ответов:

Я нашел ответ в этой ссылке: цвет строки состояния не меняется с относительной компоновкой в качестве корневого элемента

Так получается, нам нужно удалить

      <item name="android:statusBarColor">@android:color/transparent</item>

в стилях.xml (v21). И это прекрасно работает для меня.

(немного опоздала на вечеринку, но это может помочь кому-то)

у меня была точно такая же проблема. Так или иначе, некоторые действия были нормальными, в то время как новые, которые я создал, показывали белую строку состояния вместо colorPrimaryDark значение.

попробовав несколько советов, я заметил, что нормальная рабочая деятельность, где все используют CoordinatorLayout как корень макета, в то время как для других Я заменил его обычными макетами, потому что мне не нужны функции (анимация и т. д.), предоставляемые CoordinatorLayout.

Итак, решение состоит в том, чтобы сделать CoordinatorLayout корневой макет, а затем внутри него добавьте свой прежний корень макета. Вот пример:

<?xml version="1.0" encoding="utf-8"?>
<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">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <!-- your activity content here-->


  </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

обратите внимание, что без android:fitsSystemWindows="true" это решение не работает для меня.

тестируется на леденец и зефир

после неудачной попытки все вышеперечисленное я обнаружил, что явно установка темы Исправлена проблема.

setTheme(R.style.AppTheme);

Это должно идти перед супер.OnCreate () в вашей деятельности.

добавить это в свой стиль.xml

    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

и это в вашем onCreate ();

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

просто поместите этот элемент в свой v21\styles.XML-код :

true

Это должно выглядеть так :

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

я исправил свою проблему, изменив макет активности с FrameLayout на RelativeLayout. Спасибо всем, кто пытался помочь!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/transparent">

    <android.support.v4.view.ViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/theme_primary_dark"
      android:fitsSystemWindows="true" />

</RelativeLayout>

попробовать иерархия-просмотра или ViewInspector. Эти инструменты могут помочь вам.

я столкнулся с той же проблемой. То, что я сделал, было в "v21/styles.xml " файл a изменил значение true:

 <item name="windowDrawsSystemBarBackgrounds">true</item>

to:

 <item name="windowDrawsSystemBarBackgrounds">false</item>
 <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style

просто замените это, statusBarColor должен быть вашим ожидаемым цветом, а не прозрачным

лучше

Проверьте ваш стиль.xml-файл, в котором находится ваша тема NoActionBar. Убедитесь, что у него есть родитель в качестве темы.Совместимости приложений.NoActionBar, а также настроить его, добавив свою цветовую схему. Наконец, установить свои темы в манифесте по мере необходимости.

Ниже приведен пример моего стиля.xml-файл (ActionBar + NoActionBar).

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- No ActionBar application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

для меня это сработало следующим образом :

  1. установить тему .NoActionBar
  2. оберните панель инструментов в android.support.design.widget.AppBarLayout
  3. сделать android.support.design.widget.CoordinatorLayout как макет родителей.

по существу это третий шаг, который рисует строку состояния в colorPrimaryDark в противном случае он не тянет, если вы используете NoActionBar тема. 2-й шаг даст вашей панели инструментов, что оверлея.

просто удалите следующий тег из стиля v21 @андроид:цвет/прозрачный

Это работает для меня.

Я не уверен, что это поздно, но я надеюсь, что это поможет кому-то. * Сделайте поддельный вид с прозрачным фоном, который соответствует макету, и сделайте coordinatorlayout в качестве элемента корневого макета.

<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:fitsSystemWindows="true" />


<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/something" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   .... YOUR LAYOUT

<item name="android:statusBarColor">@android:color/transparent</item>

вы увидите эту строку кода в значениях / стилях / стилях.xml (v21). Удалите его, и это решает проблему

ссылка на этот ответ

Я предполагаю, что это вызвано вашим android:windowBackground. Это @color/background_material_light ссылка на белый?

проверить это Панель инструментов становится белым-AppBar не рисуется после прокрутки с экрана

https://code.google.com/p/android/issues/detail?id=178037#c19

Я использую библиотеки 23.0.0. и ошибка все еще возникает.

обходной путь для этого-добавление представления, которое почти не занимает места и может быть невидимым. См. структуру ниже.

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.Toolbar
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height=".3dp"
        android:visibility="visible"/>

</android.support.design.widget.AppBarLayout>

Это вопросы на Stackoverflow.com см. этот баг тоже: панель инструментов CoordinatorLayout невидима при вводе до полной высоты AppBarLayout-макет иногда невидимый, как только он входит в представление (даже если он не введен)

проверьте цветовые схемы, реализованные в стилях-21

для стилей v23

 <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

для стилей v21

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

[Output]

разверните каталог res -> values - > styles на панели проекта.

открыть стили.xml (v21)

ИСПОЛЬЗУЙТЕ ЛЮБОЙ ИЗ СПОСОБОВ СНИЗУ

  1. изменить правда до ложные на android:windowDrawsSystemBarBackgrounds собственность.
  2. изменить @android: цвет / прозрачный до @color / colorPrimaryDark на android:statusBarColor собственность.
  3. удалить android:statusBarColor свойства линия.

Если вы используете RelativeLayout / CoordinatorLayout это решение, которое работает для меня:

вы должны использовать

  • CoordinatorLayout
  • AppBarLayout

помните, чтобы использовать CoordinatorLayout вместо RelativeLayout (производительность лучше и отлично работает с AppBarLayout)

вот как должен начинаться ваш фрагмент

<?xml version="1.0" encoding="utf-8"?>
<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:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >
    ...

хорошего кода!

Если ваш v21 / стили.xml содержит

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

затем, удалить или комментарий ниже строки или изменить цвет строки состояния,

<item name="android:statusBarColor">@android:color/transparent</item>

его работает нормально. Надеюсь, что это полезно. Спасибо.