Рядок стану стає білим і за ним не відображається вміст


96

Я випробовую AppCompat на Зефір. І я хочу мати прозорий рядок стану, однак він стає білим. Я спробував кілька рішень, але вони не працювали для мене ( прозорий рядок стану не працює з windowTranslucentNavigation = "false" , Lollipop: намалюйте позаду 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>

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


Чи можете ви вирішити цю проблему? У мене така ж проблема. В одному з моїх
занять

1
@ kirtan403 Я виправив свою проблему, змінивши макет активності з FrameLayout на RelativeLayout. Перегляньте мою відповідь.
pt2121

Моя відносна лише все ще отримує білу панель стану. Я відправив питання тут: stackoverflow.com/q/33890066/1820644
kirtan403

Поборовшись цілу добу, я знайшов рішення, яке мені підійшло. Ось відповідь: stackoverflow.com/a/33892569/1820644
kirtan403

Я змінив статус android: windowTranslucentStatus на false і працює
Кіран Бенні Джозеф

Відповіді:


167

Я знайшов відповідь у цьому посиланні: Колір рядка стану не змінюється, коли відносний макет є кореневим елементом

Отож виявляється, нам потрібно видалити

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

у styles.xml (v21). І це прекрасно працює для мене.


Так, це рішення. Оскільки android: fitsSystemWindows спричинить проблеми під час прокручування панелі вкладок. Знайшов ту саму відповідь, але ви опублікували її раніше. Також згадайте, що це, за замовчуванням, перезаписане, я думаю.
Джобберт

Це повинно бути позначено як прийняте рішення. Ця проблема повзала по всьому моєму додатку, це рішення виправляло її скрізь, просто коментуючи цей рядок. Врятував мене такий головний біль!
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"цього рішення мені не підходить.

Випробувано на льодяниках та зефірі


3
Рішення спрацювало і для мене. Але .. чому це трапляється? Належний колір панелі стану відображається, коли кореневим елементом є DrawerLayout або CoordinatorLayout
user3316561

3
Це спрацювало у мене лише при додаванні android:fitsSystemWindows="true"до CoordinatorLayoutAndroid 8.
Франко

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

У android:fitsSystemWindows="true"мене не вийшло. Що вирішило мою проблему, так це використовувати тему, яка не AppTheme.NoActionBarстосується активності з CoordinatorLayout. Не знаю, чому це виправлено.
bmdelacruz

CoordinatorLayoutабо android:fitsSystemWindows="true"жоден не працює на мене.
Аліф Хаснайн

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

будь ласка, допоможіть у цьому питанні ... та сама проблема тут .... жодне з вирішень досі не працює
Саїд Яссані

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

9

Невдало спробувавши все вищесказане, я виявив, що явне встановлення теми вирішило проблему.

setTheme(R.style.AppTheme);

Це має відбуватися перед super.OnCreate () у вашій діяльності.


1
Я можу підтвердити, що це виправляє помилкову активність у
Зефірі

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

перед супер.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значення в останніх 2 пунктах. Дивно, але дякую.
JCarlosR,

Він працює лише з двома останніми рядками, але вміст переходить за рядок стану, відступ / поле або 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: колір / прозорий

Це працює для мене.


@android: колір / прозорість не є "тегом". Це може бути значення атрибута стилю, але це не "тег". Що робити, якщо в ОП це значення визначено більше одного разу? Якого він повинен зняти? Ваша відповідь занадто загальна.
захищений

так, так було і зі мною .. дякую, Шендре! :) і для Вашого коментаря @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>

2

Для мене це спрацювало, виконавши наступне:

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

По суті, це третій крок, який малює рядок стану, colorPrimaryDarkінакше він не малюється, якщо ви використовуєте NoActionBarтему. Другий крок надасть панелі інструментів цей шар .


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>

Його добре працює. Сподіваюся, це корисно. Дякую.


2

Я знайшов рішення для цього -

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

додайте це у свій стиль, і це буде працювати для api 21 або вище.


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! Чи можете ви відредагувати свою відповідь, щоб детальніше пояснити, чому ця відповідь працює? Короткі пояснення вашого коду проходять довгий шлях!
Гігазель

0

Я припускаю, що це викликано вашим android:windowBackground. Це @color/background_material_lightпосилання на білий?


Ні. Це точно не білий, але все одно спасибі! (На ньому ви можете побачити білі піктограми.)
pt2121

Я неправильно прочитав ваше запитання. Спробуйте замінити <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>

Примітка: Розмальовка рядка стану не підтримується нижче рівня API 21.


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

Додайте цей 2 рядок у java-файл нижче


1
Ласкаво просимо до Stack Overflow. Чи можете ви, будь ласка, розібратися, як працює ваш фрагмент коду та як він допомагає вирішити питання щодо ОП? Будь ласка , зверніться до , як написати хороший відповідь , щоб поліпшити ваш відповідь
Том M
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.