Bagaimana cara mengubah warna bilah status agar sesuai dengan aplikasi di Lollipop? [Android]

96

Dalam pembaruan lollipop baru, saya melihat bahwa dengan aplikasi Google asli, warna bilah status berubah agar sesuai dengan bilah tindakan pada aplikasi yang Anda jalankan. Saya melihatnya di aplikasi Twitter juga, jadi saya rasa bukan hanya Google yang bisa melakukannya.

Adakah yang tahu bagaimana melakukan ini jika memungkinkan?

Briscoooe
sumber

Jawaban:

220

Untuk mengubah warna bilah status gunakan setStatusBarColor (warna int) . Menurut javadoc, kita juga perlu menyetel beberapa bendera di jendela.

Cuplikan kode yang berfungsi:

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


Ingatlah bahwa warna bilah status sesuai pedoman Desain Material dan warna bilah tindakan harus berbeda:

  • ActionBar harus menggunakan 500 warna primer
  • StatusBar harus menggunakan warna primer 700

Lihat screenshot di bawah ini:

masukkan deskripsi gambar di sini

klimat
sumber
4
Perhatikan bahwa efeknya mungkin tidak muncul di emulator. Misalnya, contoh proyek ini memberi warna pada bilah status pada Nexus 9 tetapi tidak pada emulator Android 5.0.
CommonsWare
1
@mate: Saya mengacu pada emulator Android SDK. Senang mengetahui bahwa ini berfungsi pada Genymotion.
CommonsWare
3
@Azad Tidak, tidak. Untuk menggunakan potongan kode di atas, Anda harus memastikan bahwa perangkat Anda berjalan pada API 21 atau lebih tinggi.
klimat
1
Saya sedang mengerjakan proyek yang relatif sederhana dan saya harus mengatakan bahwa saya baru saja menggunakan getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));dan bekerja dengan sempurna. Tidak yakin tentang konteks di mana bendera sangat diperlukan.
Joaquin Iurchuk
3
Saya ingin menunjukkan warna di perangkat pra lollipop juga. Bagaimana caranya?
WISHY
48

Cukup tambahkan ini di Anda styles.xml. ColorPrimary untuk bilah tindakan dan colorPrimaryDark untuk bilah status.

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

Gambar dari pengembang android ini menjelaskan lebih lanjut tentang palet warna. Anda dapat membaca lebih lanjut di tautan ini .

masukkan deskripsi gambar di sini

Gjoko Bozinov
sumber
Android Studio membuat entri berikut untuk setiap proyek: <color name="colorPrimary">#somecolor</color>dan <color name="colorPrimaryDark">#somecolor</color>. Mereka dapat diubah untuk mencapai efek yang diinginkan.
Neurotransmitter
41

Cara lain untuk menyetel warna bilah status adalah melalui style.xml .

Untuk melakukan itu, buat file style.xml di bawah folder res / values-v21 dengan konten ini:

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

Edit: seperti yang ditunjukkan dalam komentar, saat menggunakan AppCompat kodenya berbeda. Dalam file res / values ​​/ style.xml gunakan:

<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
sumber
1
Lakukan itu. Tapi tidak berhasil. Tapi kemudian saya menggunakan AppCompat, bukan Material.
Martin
3
@Martin Untuk appcompat, gunakan colorPrimaryDark tanpa awalan android.
Michiel
tidak berfungsi untuk appcompat juga (diuji pada Level 18)
Mohammad Zekrallah
Warna bilah status hanya akan berfungsi pada perangkat dengan OS API Level 21 dan di atasnya. Juga, dalam manifes Anda, pastikan Anda tidak mengganti gaya ini pada aktivitas individu.
Levon
untuk browser cara mengubah warna bilah pencarian sama dengan warna aplikasi
R. Anandan
23

Untuk menyetel warna bilah status, buat file style.xml di bawah folder res / values-v21 dengan konten ini:

<?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
sumber
itu mengatakan tidak bisa menyelesaikan jendela simbolDrawsSystemBarBackgrounds
jmhostalet
4

Tambahkan baris ini dengan gaya v21 jika Anda menggunakan dua gaya.

  <item name="android:statusBarColor">#43434f</item>
Amit Walke
sumber
Ini tidak bekerja tanpa menyetel benderaandroid:windowDrawsSystemBarBackgrounds
Slav
4

Juga jika Anda menginginkan status-barwarna yang berbeda untuk aktivitas yang berbeda ( fragmen ), Anda dapat melakukannya dengan langkah-langkah berikut (bekerja pada API 21 dan yang lebih baru):

Pertama buat values21/style.xmldan masukkan kode berikut:

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

Kemudian tentukan tema Putih | Gelap di values/style.xmlseperti Anda berikut ini:

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

Juga jangan lupa untuk menerapkan tema di file manifest.xml.

Amir
sumber
2

Di perangkat Android pra Lollipop Anda dapat melakukannya dari SystemBarTintManager Jika Anda menggunakan android studio cukup tambahkan systembartint lib di file gradle Anda.

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

Kemudian dalam aktivitas Anda

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