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>
android
android-support-library
android-appcompat
androiddesignsupport
android-6.0-marshmallow
pt2121
źródło
źródło
Odpowiedzi:
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.
źródło
(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
colorPrimaryDark
wartości wyświetlały biały pasek stanu .Po wypróbowaniu kilku wskazówek zauważyłem, że normalne czynności robocze
CoordinatorLayout
był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
CoordinatorLayout
głó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
źródło
android:fitsSystemWindows="true"
doCoordinatorLayout
Androida 8.CoordinatorLayout
gdy doświadczyłem tego samego problemu, a konkretna właściwość, która go rozwiązała, toandroid:fitsSystemWindows="true"
android:fitsSystemWindows="true"
mnie nie działa. Rozwiązaniem mojego problemu jest użycie motywu, którego nie maAppTheme.NoActionBar
w działaniu z rozszerzeniemCoordinatorLayout
. Nie wiem, dlaczego to naprawiło.CoordinatorLayout
albo teżandroid:fitsSystemWindows="true"
nie działa dla mnie.<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
źródło
Aby zobaczyć zawartość, musisz dodać tę właściwość do swojego stylu
<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>
źródło
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);
źródło
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.
źródło
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>
źródło
false
wartości w ostatnich 2 pozycjach. Dziwne, ale dzięki.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>
źródło
<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
źródło
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.
źródło
Po prostu usuń następujący tag ze stylu v21 @android: color / transparent
To działa dla mnie.
źródło
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.
źródło
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>
źródło
U mnie zadziałało, wykonując następujące czynności:
.NoActionBar
android.support.design.widget.AppBarLayout
android.support.design.widget.CoordinatorLayout
jako układ nadrzędny.Zasadniczo jest to trzeci krok, który rysuje pasek stanu w
colorPrimaryDark
przeciwnym razie nie jest rysowany, jeśli używaszNoActionBar
motywu. Drugi krok da Twojemu paskowi narzędzi tę nakładkę .źródło
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>
źródło
[
Rozwiń katalog res -> values -> styles z panelu projektu.
Otwórz styles.xml (v21)
UŻYJ DOWOLNEGO Z PONIŻEJ SPOSOBÓW
android:windowDrawsSystemBarBackgrounds
właściwości.android:statusBarColor
właściwości.android:statusBarColor
linię własności.źródło
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.
źródło
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
źródło
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); }
źródło
Domyślam się, że jest to spowodowane przez
android:windowBackground
. Czy@color/background_material_light
to nawiązanie do bieli?źródło
<item name="android:statusBarColor">@android:color/transparent</item>
z<item name="android:statusBarColor">@null</item>
.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)
źródło
Jeśli używasz RelativeLayout / CoordinatorLayout, to jest rozwiązanie, które zadziałało dla mnie:
Musisz użyć
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!
źródło
<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
źródło
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.
źródło
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
źródło
Window window = this.getWindow(); window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));
Dodaj tę 2 linie w pliku java poniżej
źródło