12

Mam układ, który był używany do aktualizacji koloru tła paska stanu na podstawie colorPrimaryDark.Jak uzyskać kolor tła paska stanu, aby pokazać colorPrimaryDark

To zadziałało, gdy układ główny układu był CoordinatorLayout, ale kiedy przełączyłem go na LinearLayout, tło paska stanu nie jest już aktualizowane.

Źródło układu i zrzut ekranu wklejone są poniżej. Podany jest również przykład prawidłowego układu.

Dziękujemy!

layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".churches.ChurchesActivity"> 

    <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> 
    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/coordinatorLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 

     <FrameLayout 
      android:id="@+id/contentFrame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 
    </android.support.design.widget.CoordinatorLayout> 

</LinearLayout> 

styles.xml

<resources> 

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

<style name="AppTheme.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
</style> 

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/> 

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> 

style-v21.xml

<resources> 

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

Pasek stanu nie jest colorPrimaryDark

Status Bar is not colorPrimaryDark

Pasek stanu jest colorPrimaryDark

Status Bar is colorPrimaryDark

+0

pokaż nam swój styl.xml –

Odpowiedz

16

Zamieszczając style-v21.xml znalazłem, że Android: statusBarColor ustawiono transparent:

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

Zmiana android: statusBarColor do colorPrimaryDark naprawił. Dziękuję Ci!

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

Nie wiem, dlaczego statusBarColor wszedł do gry po włączeniu do LinearLayout ze CoordinatorLayout. Dziękuję Ci!

+1

CoordinatorLayout rysuje tło paska stanu, gdy ma on górną część z okien systemu. Domyślnie używa 'colorPrimaryDark' jako losowania do rysowania. – Karakuri

+0

Nie wiem, jak bym to rozgryzł! Dziękuję za wyjaśnienie! – dazza5000

+0

Nie działa dla mnie .... – GvSharma

0

Spróbuj dodać ten androida: fitsSystemWindows = "true" właściwość dla układu liniowego i zobaczyć.

+0

Próbowałem tego, ale z jakiegoś powodu android: fitsSystemWindows = "true" nie miał tego samego efektu, gdy zastosowano go do LinearLayout, tak jak miało to miejsce w przypadku zastosowania do CoordinateLayout. Dobry pomysł! Dziękuję Ci! – dazza5000

+0

@Shiva, to nie jest poprawna odpowiedź, ustawienie 'android: fitsSystemWindows =" true "' sprawi, że 'LinearLayout' doda trochę paddingTop, to nie sprawi, że kolor narysowania" LinearLayout "na pasku stanu. – neevek

0

Dodaj <item name="android:navigationBarColor">?attr/colorPrimaryDark</item> w swoim temacie lub wywołaj programowo window.setNavigationBarColor(@ColorInt int color). Ale zwrócić uwagę, że navigationBarColor wprowadza od Androida Lollipop (API 21), co oznacza navigationBarColor nie jest obsługiwana, gdy API < 21.

1

Spróbuj aktywności przed ustawić widok zawartości

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     getWindow().setStatusBarColor(getFactorColor(getResources().getColor(R.color.action_bar_color), 0.4f)); 
} 

gdzie jest metoda getFactorColor

public static int getFactorColor(int color, float factor) { 
    float[] hsv = new float[3]; 
    Color.colorToHSV(color, hsv); 
    hsv[2] *= factor; 
    color = Color.HSVToColor(hsv); 
    return color; 
} 
0

Jeśli nie przejdziesz przez wszystkie próby. Po prostu unieważnij pamięć podręczną i uruchom ponownie projekty. zdecydowanie to zadziała.