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

pt2121
źródło
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.

Phoenix Wang
źródło
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

Mauro Banze
źródło
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

Shrini Jaiswal
źródło
17

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

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>
Andres Paez
źródło
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);
Michele Lacorte
źródło
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.

James Britton
źródło
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>

Rami
źródło
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>
Degomos
źródło
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

Phares
źródło
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.

pt2121
źródło
5

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

To działa dla mnie.

Shendre Kiran
źródło
@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.

being_sohelkhan
źródło
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>
Nilesh Mahant
źródło
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ę .

priyankvex
źródło
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>
Ankit Aman
źródło
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.
Ketan Ramani
źródło
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.

sahu
źródło
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

vahidlazio
źródło
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);
        }
Valdemir Nunes de Freitas
źródło
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?

hanspeide
źródło
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)

clickdroid
źródło
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!

Faustino Gagneten
źródło
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

sanjay
źródło
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.

Raviraj
źródło
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

KiwanPark
źródło
-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

Dodaj tę 2 linie w pliku java poniżej

nitin kapsikar
źródło
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