Pasek stanu zmienia kolor na biały i nie wyświetla treści za nim


98

Próbuję AppCompat na Marshmallow. Chcę mieć przezroczysty pasek stanu, który jednak zmienia kolor na biały. Wypróbowałem kilka rozwiązań, ale nie zadziałały ( przezroczysty pasek stanu nie działa z windowTranslucentNavigation = "false" , Lollipop: rysuj za paskiem statusu z kolorem ustawionym na przezroczysty ). Oto powiązany kod.

Moje style.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>

Czynność

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

Fragment

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

wprowadź opis obrazu tutaj


Czy jesteś w stanie rozwiązać ten problem? Mam ten sam problem. W jednym z moich działań z białym paskiem statusu
kirtan403

1
@ kirtan403 Naprawiłem swój problem, zmieniając układ mojego działania z FrameLayout na RelativeLayout. Proszę zobaczyć moją odpowiedź.
pt2121

Mój jest względny, ale nadal wyświetla się biały pasek stanu.
Wysłałem

Po całodziennych zmaganiach znalazłem rozwiązanie, które działało na mnie. Oto odpowiedź: stackoverflow.com/a/33892569/1820644
kirtan403

Zmieniłem status androida: windowTranslucentStatus na false i jego działanie
Kiran Benny Joseph

Odpowiedzi:


168

Znalazłem odpowiedź w tym linku: Kolor paska stanu nie zmienia się z układem względnym jako elementem głównym

Okazuje się więc, że musimy usunąć plik

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

w styles.xml (v21). I dla mnie działa dobrze.


Tak, to jest rozwiązanie. Ponieważ android: fitSystemWindows spowoduje problemy podczas przewijania paska kart. Znalazłem tę samą odpowiedź, ale opublikowałeś ją wcześniej. Wspomnę również, że myślę, że jest to domyślnie nadpisane.
jobbert,

Należy to oznaczyć jako zaakceptowane rozwiązanie. Ten problem skradał się po całej mojej aplikacji, to rozwiązanie naprawiało go wszędzie, po prostu komentując tę ​​pojedynczą linię. Uratował mi taki ból głowy!
BMB,

Używam CoordinatorLayout, więc druga odpowiedź dla nas CoordinatorLayout jako root nie działa dla mnie (użycie fitSystemWindows = true, jak sugerowano, również nie działało). Ta odpowiedź mi pasuje.
Bruce,

A jeśli chcę, aby kolor paska stanu był przezroczysty?
nullmn

1
@nullmn, musisz zmienić tło swojej aktywności na coś innego.
Phoenix Wang

96

(Trochę za późno na imprezę, ale może to komuś pomóc)

Miałem dokładnie ten sam problem. W jakiś sposób niektóre czynności były normalne, podczas gdy nowe, które utworzyłem, zamiast colorPrimaryDarkwartości wyświetlały biały pasek stanu .

Po wypróbowaniu kilku wskazówek zauważyłem, że normalne czynności robocze CoordinatorLayoutbyły używane jako katalog główny układu, podczas gdy w przypadku innych zastąpiłem go zwykłymi układami, ponieważ nie potrzebowałem funkcji (animacji itp.) Zapewnianych przezCoordinatorLayout .

Rozwiązaniem jest więc utworzenie CoordinatorLayoutgłównego układu, a następnie dodanie do niego poprzedniego katalogu głównego układu. Oto przykład:

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

NALEŻY PAMIĘTAĆ, że bez android:fitsSystemWindows="true" tego rozwiązania u mnie nie działa.

Testowane na Lollipopie i Marshmallow


3
Rozwiązanie zadziałało również dla mnie. Ale… dlaczego tak się dzieje? Właściwy kolor paska stanu jest wyświetlany, gdy root to DrawerLayout lub CoordinatorLayout
user3316561

3
To działało tylko dla mnie podczas dodawania android:fitsSystemWindows="true"do CoordinatorLayoutAndroida 8.
Franco

2
@Franco Myślę, że to najważniejsza część rozwiązania. Mówię to, ponieważ miałem, CoordinatorLayoutgdy doświadczyłem tego samego problemu, a konkretna właściwość, która go rozwiązała, toandroid:fitsSystemWindows="true"
Wilhelm,

U android:fitsSystemWindows="true"mnie nie działa. Rozwiązaniem mojego problemu jest użycie motywu, którego nie ma AppTheme.NoActionBarw działaniu z rozszerzeniem CoordinatorLayout. Nie wiem, dlaczego to naprawiło.
bmdelacruz

CoordinatorLayoutalbo też android:fitsSystemWindows="true"nie działa dla mnie.
Alif Hasnain

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

Po prostu zastąp to, statusBarColor powinien być Twoim oczekiwanym kolorem, a nie TRANSPARENTNYM


17

Aby zobaczyć zawartość, musisz dodać tę właściwość do swojego stylu

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

To zadziałało dla mnie. To powinna zostać zaakceptowana odpowiedź.
abdul rehman

11

Dodaj to w swoim style.xml

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

i to w swoim onCreate ();

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

1
Dzięki, ale to nie działa. Pasek stanu wygląda tak samo.
pt2121

proszę o pomoc w tej sprawie ... ten sam problem tutaj ... żadne z dotychczasowych rozwiązań nie działa
Saeed Jassani

@SaeedJassani znalazłem rozwiązanie, które działało dla mnie. Jeśli masz ten sam problem, spójrz na moje pytanie i odpowiedź: stackoverflow.com/a/33892569/1820644
kirtan403

9

Po bezskutecznym wypróbowaniu wszystkich powyższych stwierdziłem, że jawne ustawienie tematu rozwiązało problem.

setTheme(R.style.AppTheme);

To musi nastąpić przed super.OnCreate () w Twojej aktywności.


1
Mogę potwierdzić, że to naprawia błędną aktywność na Marshmallow
dare0021

kocham cię człowieku, działałem jak urok, chociaż nadal nie mam pojęcia dlaczego: @
Adeel Ahmad

przed super.OnCreate () jest kluczem
Karthik Rk

9

Po prostu umieść ten element w swoim v21 \ styles.xml:

prawdziwe

To powinno wyglądać tak :

<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
U mnie zadziałało, używając falsewartości w ostatnich 2 pozycjach. Dziwne, ale dzięki.
JCarlosR

Działa tylko z dwoma ostatnimi wierszami, ale zawartość znajduje się za paskiem stanu, dopełnienie / margines lub dopasowanieSystemWindows nie pomagają. Testowane na OP 5 z nugatem
Anton Makov,

9

Miałem ten sam problem. Co zrobiłem, w pliku „v21 / styles.xml” zmieniłem wartość true:

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

do:

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

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

Zobaczysz tę linię kodu w values ​​/ styles / styles.xml (v21). Usuń to, a to rozwiązuje problem

Link do tej odpowiedzi


5

Rozwiązałem problem, zmieniając układ mojego działania z FrameLayout na RelativeLayout. Dziękuję wszystkim, którzy próbowali pomóc!

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

Spróbuj hierarchy-viewer lub ViewInspector . Te narzędzia mogą ci pomóc.


5

Po prostu usuń następujący tag ze stylu v21 @android: color / transparent

To działa dla mnie.


@android: color / transparent nie jest „tagiem”. Może to być wartość atrybutu stylu, ale nie jest to „znacznik”. Co się stanie, jeśli PO ma tę wartość zdefiniowaną więcej niż raz? Który powinien usunąć? Twoja odpowiedź jest zbyt ogólna.
protectedmember

tak, dotyczyło to również mnie… dziękuję, Shendre! :) i za komentarz @protectedmember - system operacyjny nie ma płci.
zeroDivider

4

Znalazłem na to rozwiązanie -

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

dodaj to do swojego stylu i będzie działać dla API 21 lub nowszego.


3

Lepsze podejście

Sprawdź plik style.xml, w którym znajduje się motyw NoActionBar. Upewnij się, że ma on element nadrzędny jako Theme.AppCompat.NoActionBar, a także dostosuj go, dodając schemat kolorów. Na koniec ustaw swoje motywy w manifeście zgodnie z wymaganiami.

Poniżej znajduje się próbka mojego pliku 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

U mnie zadziałało, wykonując następujące czynności:

  1. Ustaw motyw .NoActionBar
  2. Owiń pasek narzędzi android.support.design.widget.AppBarLayout
  3. Utwórz android.support.design.widget.CoordinatorLayoutjako układ nadrzędny.

Zasadniczo jest to trzeci krok, który rysuje pasek stanu w colorPrimaryDarkprzeciwnym razie nie jest rysowany, jeśli używasz NoActionBarmotywu. Drugi krok da Twojemu paskowi narzędzi tę nakładkę .


2

Dla stylów v23

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

W przypadku stylów 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

[Wynik]

Rozwiń katalog res -> values ​​-> styles z panelu projektu.

Otwórz styles.xml (v21)

UŻYJ DOWOLNEGO Z PONIŻEJ SPOSOBÓW

  1. Zmień true na false we android:windowDrawsSystemBarBackgroundswłaściwości.
  2. Zmień @android: color / transparent na @ color / colorPrimaryDark inandroid:statusBarColor właściwości.
  3. Usuń android:statusBarColorlinię własności.

2

Jeśli twój v21 / styles.xml zawiera

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

Następnie usuń lub skomentuj poniżej linii lub zmień kolor paska stanu,

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

Działa dobrze. Mam nadzieję, że to jest pomocne. Dzięki.


1

Nie jestem pewien, czy jest późno, ale mam nadzieję, że to komuś pomoże. * Stwórz fałszywy widok z przezroczystym tłem, które pasuje do układu i utwórz układ koordynacyjny jako główny element układu.

<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

To dla mnie działa

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
Cześć, witamy w StackOverflow! Czy mógłbyś zmienić swoją odpowiedź, aby bardziej szczegółowo wyjaśnić, dlaczego ta odpowiedź działa? Krótkie wyjaśnienia twojego kodu mogą pomóc!
Gigazelle

0

Domyślam się, że jest to spowodowane przez android:windowBackground . Czy @color/background_material_lightto nawiązanie do bieli?


Nie. Na pewno nie jest biały, ale i tak dzięki! (Możesz zobaczyć na nim białe ikony.)
pt2121

Źle odczytałem twoje pytanie. Spróbuj wymienić <item name="android:statusBarColor">@android:color/transparent</item>z <item name="android:statusBarColor">@null</item>.
hanspeide

Żeby upewnić się, że dobrze Cię rozumiem, czy chcesz, aby obraz był wyświetlany za paskiem stanu?
hanspeide

0

Sprawdź, czy ten pasek narzędzi zmienia kolor na biały - pasek AppBar nie jest rysowany po przewinięciu poza ekran

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

Używam bibliotek 23.0.0. a błąd nadal występuje.

Obejściem tego problemu jest dodanie widoku, który prawie nie zajmuje miejsca i może być niewidoczny. Zobacz strukturę poniżej.

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

Te pytania na Stackoverflow.com odnoszą się również do tego błędu: Pasek narzędzi CoordinatorLayout niewidoczny przy wejściu do pełnej wysokości AppBarLayout - Układ czasami niewidoczny po wejściu do widoku (nawet jeśli nie jest wprowadzony)


to nie ten sam błąd. w moim przypadku jest biały zaraz po pokazaniu aktywności, a nie po przewinięciu z ekranu. mimo wszystko dzięki
pt2121

0

Jeśli używasz RelativeLayout / CoordinatorLayout, to jest rozwiązanie, które zadziałało dla mnie:

Musisz użyć

  • CoordinatorLayout
  • AppBarLayout

Pamiętaj, aby użyć CoordinatorLayout zamiast RelativeLayout (wydajność jest lepsza i doskonale współpracuje z AppBarLayout)

Tak powinien zacząć się twój fragment

<?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"
    >
    ...

Dobre kodowanie!


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>

dodaj element „windowTranslucentStatus” w stylach


0

Dodaj to w swoim style.xml

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

Uwaga: Kolorowanie paska stanu nie jest obsługiwane poniżej poziomu API 21.


0

chcesz tego, prawda?

Spróbuj tego. w [wartość] - [style.xml]

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

wiesz, nie dopasowuj schematu - rodzic

powodzenia


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

Dodaj tę 2 linie w pliku java poniżej


1
Witamy w Stack Overflow. Czy mógłbyś wyjaśnić, jak działa twój fragment kodu i jak pomaga rozwiązać pytanie dotyczące PO? Zobacz, jak napisać dobrą odpowiedź, aby poprawić swoją odpowiedź
Tom M
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.