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


98

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

Мой styles.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>

введите описание изображения здесь


Сможете ли вы решить эту проблему? У меня такая же проблема. В одном из моих
занятий

1
@ kirtan403 Я исправил свою проблему, изменив макет Activity с FrameLayout на RelativeLayout. Пожалуйста, посмотрите мой ответ.
pt2121

Мой относительный, только все еще отображается белая строка состояния. Я разместил здесь вопрос: stackoverflow.com/q/33890066/1820644
kirtan403

После дня борьбы я нашел решение, которое сработало для меня. Вот ответ: stackoverflow.com/a/33892569/1820644
kirtan403

Я изменил статус android: windowTranslucentStatus на false и он работает
Киран Бенни Джозеф

Ответы:


168

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

Оказывается, нам нужно удалить

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

в styles.xml (v21). И у меня это отлично работает.


Да, это решение. Поскольку android: fitsSystemWindows вызовет проблемы при прокручивании панели вкладок. Нашел тот же ответ, но вы опубликовали его ранее. Также упомяните, что это по умолчанию перезаписано, я думаю.
jobbert

Это должно быть отмечено как принятое решение. Эта проблема расползалась по всему моему приложению, это решение исправило ее везде, просто закомментировав эту единственную строку. Спасла меня такая головная боль!
BMB

Я использую CoordinatorLayout, поэтому другой ответ нам CoordinatorLayout в качестве корня у меня не работает (использование fitsSystemWindows = true, как предлагалось, тоже не сработало). Этот ответ работает для меня.
Брюс

Что делать, если я хочу, чтобы цвет строки состояния был прозрачным?
nullmn

1
@nullmn, тогда вам нужно изменить фон вашей активности на что-то другое.
Phoenix Wang

96

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

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

Проверено на Lollipop и Marshmallow


3
Решение сработало и для меня. Но .. почему это происходит? Правильный цвет StatusBar отображается, когда root - DrawerLayout или CoordinatorLayout
user3316561

3
Это работало только для меня при добавлении android:fitsSystemWindows="true"к CoordinatorLayoutв Android 8.
Франко

2
@Franco Я думаю, что это самая важная часть решения. Я говорю это, потому что CoordinatorLayoutкогда я столкнулся с той же проблемой, и конкретное свойство, которое исправило это для меня, былоandroid:fitsSystemWindows="true"
Вильгельм

У android:fitsSystemWindows="true"меня не сработало. Моя проблема была решена с помощью темы, которой нет AppTheme.NoActionBarв действии с расширением CoordinatorLayout. Я не знаю, почему это исправило.
bmdelacruz

CoordinatorLayoutили android:fitsSystemWindows="true"ни то, ни другое не работает для меня.
Алиф Хаснайн

18
 <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 должен быть вашим ожидаемым цветом, а не ПРОЗРАЧНЫМ


17

Вы должны добавить это свойство в свой стиль, чтобы видеть контент

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>

Это сработало для меня. Это должен быть принятый ответ.
Абдул Рехман

11

Добавьте это в свой style.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);

1
Спасибо, но это не работает. Строка состояния выглядит так же.
pt2121 06

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

@SaeedJassani Я нашел решение, которое сработало для меня. Если у вас такая же проблема, взгляните на мой вопрос и ответ: stackoverflow.com/a/33892569/1820644
kirtan403

9

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

setTheme(R.style.AppTheme);

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


1
Я могу подтвердить, что это исправляет ошибочную активность на Marshmallow
dare0021

люблю тебя, чувак, работал как шарм, хотя я до сих пор не знаю почему: @
Адил Ахмад

перед super.OnCreate () является ключом
Karthik Rk

9

Просто поместите этот элемент в свой v21 \ styles.xml:

правда

Должно получиться так:

<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>


1
У меня это сработало, используя falseзначения в последних двух элементах. Странно, но спасибо.
JCarlosR 02

Он работает только с двумя последними строками, но содержимое находится за строкой состояния, отступы / поля или fitsSystemWindows не помогают. Протестировано на OP 5 с нугой
Антон Маков

9

Я столкнулся с той же проблемой. Я сделал следующее: в файле "v21 / styles.xml" изменилось значение true:

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

кому:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>


5

Я исправил свою проблему, изменив макет Activity с 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 . Эти инструменты могут вам помочь.


5

Просто удалите следующий тег из стиля v21 @android: color / transparent

У меня это работает.


@android: color / transparent не является «тегом». Это может быть значение атрибута стиля, но не «тег». Что, если OP определил это значение более одного раза? Какой из них он должен удалить? Ваш ответ слишком общий.
protectedmember

да, для меня это тоже было так ... спасибо, Шендре! :) и за ваш комментарий @protectedmember - ОС не имеет пола.
zeroDivider

3

Лучший подход

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

Ниже приведен образец моего файла styles.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>

3

Я нашел решение для этого -

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>

добавьте это в свой стиль, и он будет работать с API 21 или выше.


2

Для меня это сработало, выполнив следующие действия:

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

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


2

Для стилей 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>

2

[Вывод]

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

Откройте файл styles.xml (v21)

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

  1. Измените true на false в android:windowDrawsSystemBarBackgroundsсвойстве.
  2. Измените @android: color / transparent на @ color / colorPrimaryDark в android:statusBarColorсвойстве.
  3. Удалите android:statusBarColorстроку свойства.

2

Если ваш v21 / styles.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>

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


1

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

<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


1

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }

1
Привет, добро пожаловать в StackOverflow! Не могли бы вы отредактировать свой ответ, чтобы уточнить, почему этот ответ работает? Краткие объяснения вашего кода имеют большое значение!
Gigazelle

0

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


Нет. Он определенно не белый, но все равно спасибо! (Вы можете увидеть на нем белые значки.)
pt2121 05

Я неправильно понял твой вопрос. Попробуйте заменить <item name="android:statusBarColor">@android:color/transparent</item>на <item name="android:statusBarColor">@null</item>.
hanspeide

Чтобы убедиться, что я правильно вас понял, вы хотите, чтобы изображение отображалось за строкой состояния?
hanspeide

0

Убедитесь, что эта панель инструментов становится белой - 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 - Макет иногда невидим, когда он входит в представление (даже если он не введен)


это не та же ошибка. в моем случае он белый сразу после того, как активность отображается, а не после прокрутки с экрана. в любом случае спасибо
pt2121

0

Если вы используете RelativeLayout / 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"
    >
    ...

Хорошая кодировка!


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

добавить в стили элемент windowTranslucentStatus


0

Добавьте это в свой style.xml

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

Примечание. Цвет строки состояния не поддерживается ниже 21 уровня API.


-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

Добавьте эти 2 строки в файл java ниже


1
Добро пожаловать в Stack Overflow. Не могли бы вы рассказать, как работает ваш фрагмент кода и как он помогает в решении вопроса OP? Пожалуйста, обратитесь к тому, как написать хороший ответ, чтобы улучшить свой ответ
Tom M
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.