Jak zmienić kolor paska stanu, aby pasował do aplikacji w Lollipop? [Android]

96

W nowej aktualizacji Lollipop zauważyłem, że w natywnych aplikacjach Google kolor paska stanu zmienia się, aby pasował do paska akcji w uruchomionej aplikacji. Widzę, że jest to również w aplikacji Twitter, więc domyślam się, że nie tylko Google może to zrobić.

Czy ktoś wie, jak to zrobić, jeśli to możliwe?

Briscoooe
źródło

Odpowiedzi:

221

Aby zmienić kolor paska stanu, użyj setStatusBarColor (int color) . Zgodnie z javadoc, musimy również ustawić flagi w oknie.

Działający fragment kodu:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(activity, R.color.example_color));


Pamiętaj, że zgodnie z wytycznymi Material Design kolor paska stanu i kolor paska akcji powinny być różne:

  • ActionBar powinien używać podstawowego koloru 500
  • StatusBar powinien używać podstawowego koloru 700

Spójrz na zrzut ekranu poniżej:

wprowadź opis obrazu tutaj

klimat
źródło
4
Zwróć uwagę, że efekt może nie pojawić się w emulatorze. Na przykład ten przykładowy projekt powoduje zabarwienie paska stanu na Nexusie 9, ale nie na emulatorze systemu Android 5.0.
CommonsWare
1
@mate: Miałem na myśli emulator Android SDK. Dobrze wiedzieć, że działa na Genymotion.
CommonsWare
3
@Azad Nie, to nie jest. Aby użyć powyższego fragmentu kodu, musisz upewnić się, że Twoje urządzenie działa na API 21 lub nowszym.
klimat
1
Pracuję nad stosunkowo prostym projektem i muszę powiedzieć, że właśnie użyłem getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));i zadziałało idealnie. Nie jestem pewien kontekstu, w którym flagi są absolutnie konieczne.
Joaquin Iurchuk
3
Chcę również pokazać kolor w urządzeniach pre Lollipop. Jak można to zrobić?
WISHY
48

Po prostu dodaj to do you styles.xml. ColorPrimary jest dla paska akcji, a colorPrimaryDark dla paska stanu.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
</style>

To zdjęcie od programisty Androida wyjaśnia więcej na temat palety kolorów. Możesz przeczytać więcej pod tym linkiem .

wprowadź opis obrazu tutaj

Gjoko Bozinov
źródło
Android Studio tworzy następujące wpisy dla każdego projektu: <color name="colorPrimary">#somecolor</color>i <color name="colorPrimaryDark">#somecolor</color>. Można je zmieniać, aby osiągnąć zamierzony efekt.
Neurotransmitter
41

Innym sposobem ustawienia koloru paska stanu jest użycie style.xml .

Aby to zrobić, utwórz plik style.xml w folderze res / values-v21 z następującą zawartością:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material">
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="android:colorPrimaryDark">@color/blue_dark</item>
    </style>
</resources>

Edycja: jak wskazano w komentarzach, podczas korzystania z AppCompat kod jest inny. W pliku res / values ​​/ style.xml użyj zamiast tego:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">   
    <!-- Set AppCompats color theming attrs -->
    <item name="colorPrimary">@color/my_awesome_red</item>
    <item name="colorPrimaryDark">@color/my_awesome_darker_red</item>
    <!-- Other attributes -->
</style>
Alberto Malagoli
źródło
1
Zrobił to. Ale nie zadziałało. Ale potem używam AppCompat zamiast Material.
Martin
3
@Martin Dla appcompat użyj colorPrimaryDark bez prefiksu Androida.
Michiel
nie działa również na appcompat (testowane na poziomie 18)
Mohammad Zekrallah,
Kolor paska stanu będzie działał tylko na urządzeniach z interfejsem OS API na poziomie 21 i wyższym. Ponadto w swoim manifeście upewnij się, że nie zastępujesz tego stylu w odniesieniu do poszczególnych czynności.
Levon
dla inappbrowser jak zmienić kolor paska wyszukiwania taki sam jak kolor aplikacji
R.Anandan
23

Aby ustawić kolor paska stanu, utwórz plik style.xml w folderze res / values-v21 z następującą zawartością:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppBaseTheme" parent="AppTheme">
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/blue</item>
    </style>

</resources>
Muhammad Aamir Ali
źródło
mówi, że nie można rozwiązać symbol windowDrawsSystemBarBackgrounds
jmhostalet
4

Dodaj tę linię w stylu v21, jeśli używasz dwóch stylów.

  <item name="android:statusBarColor">#43434f</item>
Amit Walke
źródło
To nie działa bez ustawienia flagiandroid:windowDrawsSystemBarBackgrounds
słowiańskie
4

Jeśli chcesz mieć inny status-barkolor dla różnych czynności ( fragmentów ), możesz to zrobić, wykonując następujące czynności (pracuj na API 21 i nowszych):

Najpierw utwórz values21/style.xmli umieść następujący kod:

 <style name="AIO" parent="AIOBase">
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:windowContentTransitions">true</item>
    </style>

Następnie zdefiniuj białe | ciemne motywy w values/style.xmlnastępujący sposób:

 <style name="AIOBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_primary_dark</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:textColorPrimary">@android:color/black</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@color/color_primary_dark
        </item>
        <item name="android:textColor">@color/gray_darkest</item>
        <item name="android:windowBackground">@color/default_bg</item>
        <item name="android:colorBackground">@color/default_bg</item>
    </style>


    <style name="AIO" parent="AIOBase" />

    <style name="AIO.Dark" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#171717
        </item>
    </style>

    <style name="AIO.White" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#bdbdbd
        </item>
    </style>

Nie zapomnij również zastosować motywów w swoim manifest.xml.

Amir
źródło
2

Na urządzeniach z Androidem w wersji wcześniejszej niż Lollipop możesz to zrobić z SystemBarTintManager. Jeśli używasz Android Studio, po prostu dodaj Systembartint lib do pliku gradle.

dependencies {
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    ...
}

Następnie w swojej działalności

// create manager instance after the content view is set
SystemBarTintManager mTintManager = new SystemBarTintManager(this);
// enable status bar tint
mTintManager.setStatusBarTintEnabled(true);
mTintManager.setTintColor(getResources().getColor(R.color.blue));
Muhammad Aamir Ali
źródło