Ubah warna bilah status dengan AppCompat ActionBarActivity

146

Di salah satu Kegiatan saya, saya mengubah warna Toolbar menggunakan Palette. Tapi di 5.0 perangkat yang menggunakan ActionBarActivitysatu status barwarna adalah warna saya colorPrimaryDarkdalam kegiatan tema saya jadi saya harus 2 warna yang sangat berbeda dan tidak terlihat baik.

Saya menyadari bahwa dalam 5.0 Anda dapat menggunakan Window.setStatusBarColor()tetapi ActionBarActivitytidak memiliki ini.

jadi pertanyaan saya adalah di 5.0 bagaimana saya bisa mengubah warna bilah status ActionBarActivity?

tyczj
sumber
Sudahkah Anda mencoba menggunakan lib SystemBarTint? github.com/jgilfelt/SystemBarTint
Nikola Despotoski
Kemungkinan rangkap dari Bagaimana mengubah warna bilah status di android
DSoldo

Jawaban:

420

Saya tidak yakin saya mengerti masalahnya.

Saya ingin mengubah warna bilah status secara terprogram (dan asalkan perangkat memiliki Android 5.0) maka Anda dapat menggunakannya Window.setStatusBarColor(). Seharusnya tidak membuat perbedaan apakah aktivitas tersebut berasal dari Activityatau ActionBarActivity.

Coba lakukan:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.BLUE);
}

Baru saja menguji ini dengan ActionBarActivitydan itu berfungsi dengan baik.


Catatan: Mengatur FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSbendera secara program tidak diperlukan jika values-v21file gaya Anda sudah diatur, melalui:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
matiash
sumber
1
ah ok saya tidak menggunakangetWindow()
tyczj
ini akan macet ketika kode LOLLIPOP tidak ditemukan di android lama. yang terbaik untuk menggunakan> = 21
code511788465541441
12
@ code578841441 Sebenarnya, itu seharusnya tidak terjadi. Konstanta digarisbawahi saat menyusun.
matiash
4
@ code578841441: Itu karena Anda mengkompilasi dengan SDK yang lebih lama. Anda harus selalu berusaha untuk mengkompilasi dengan Android SDK terbaru, bahkan jika Anda memiliki batasan versi API yang lebih lama (yaitu minSdkVersiondan / atau targetSdkVersionatribut pada <uses-sdk ...>elemen).
dbm
3
Saya juga harus memanggil getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); untuk membuatnya bekerja
Philipp E.
61

Ada berbagai cara untuk mengubah warna bilah status.

1) Menggunakan styles.xml. Anda dapat menggunakan atribut android: statusBarColor untuk melakukan ini dengan cara yang mudah namun statis.

Catatan: Anda juga dapat menggunakan atribut ini dengan tema Material.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) Anda bisa menyelesaikannya secara dinamis menggunakan metode setStatusBarColor (int) di kelas Window. Tetapi ingat bahwa metode ini hanya tersedia untuk API 21 atau lebih tinggi. Jadi pastikan untuk memeriksa itu, atau aplikasi Anda pasti akan macet di perangkat yang lebih rendah.

Berikut adalah contoh kerja dari metode ini.

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

di mana primaryDark adalah 700 warna warna primer yang saya gunakan di aplikasi saya. Anda dapat menentukan warna ini dalam file colors.xml.

Cobalah dan beri tahu saya jika Anda memiliki pertanyaan. Semoga ini bisa membantu.

Aritra Roy
sumber
sepertinya window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); tidak diperlukan - tetapi ini bekerja untuk saya
bkurzius
Adakah ide mengapa versi program akan bekerja tetapi versi gaya tidak?
Andrew
Dalam kasus saya, gaya aktivitas memiliki set translucent_status flah ditetapkan, jadi tanpa perintah window.clearFlags itu tidak berfungsi. Jadi terima kasih untuk ini!
BMacedo
Oh wow! Ini harus diterima jawaban, tambahkan clearFlagsperbaiki masalah saya
fanjavaid
9

Saya tidak berpikir warna bilah status telah diterapkan di AppCompat. Ini adalah atribut yang tersedia:

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

(Dari \ sdk \ ekstra \ android \ support \ v7 \ appcompat \ res \ values ​​\ attrs.xml )

JstnPwll
sumber
1
Mungkin saja itu tidak akan pernah diterapkan di AppCompat jika versi OS yang lebih lama tidak menyediakan kemampuan untuk memodifikasi bilah status.
TheIT
2
<attr name = "colorPrimaryDark" format = "color" /> <! - Varian gelap dari warna merek utama. Secara default, ini adalah warna yang diterapkan ke bilah status (via statusBarColor) dan bilah navigasi (via navigationBarColor). ->
Soheil Setayeshi
3

Coba ini, saya menggunakan ini dan ini bekerja sangat baik dengan v21.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>
Manoj Kumar
sumber
1

Terima kasih atas jawaban di atas, dengan bantuan mereka, setelah R&D tertentu untuk aplikasi xamarin.android MVVMCross, di bawah ini berfungsi

Tandai ditentukan untuk aktivitas dalam metode OnCreate

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

Untuk setiap MvxActivity, Tema disebutkan sebagai berikut

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

SplashStyle.xml saya terlihat seperti di bawah ini

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

Dan saya punya V7 appcompact disebut.

Pallavi
sumber
1

[Versi Kotlin] Saya membuat ekstensi ini yang juga memeriksa apakah warna yang diinginkan memiliki kontras yang cukup untuk menyembunyikan UI Sistem, seperti Ikon Status Baterai, Jam, dll, jadi kami mengatur UI Sistem putih atau hitam sesuai dengan ini.

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
    var flags: Int = window.decorView.systemUiVisibility // get current flags
    var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    var setSystemUILight = lightSystemUI

    if (setSystemUILight == null) {
        // Automatically check if the desired status bar is dark or light
        setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
    }

    flags = if (setSystemUILight) {
        // Set System UI Light (Battery Status Icon, Clock, etc)
        removeFlag(flags, systemLightUIFlag)
    } else {
        // Set System UI Dark (Battery Status Icon, Clock, etc)
        addFlag(flags, systemLightUIFlag)
    }

    window.decorView.systemUiVisibility = flags
    window.statusBarColor = color
}

private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0

private fun addFlag(flags: Int, flagToAdd: Int): Int {
    return if (!containsFlag(flags, flagToAdd)) {
        flags or flagToAdd
    } else {
        flags
    }
}

private fun removeFlag(flags: Int, flagToRemove: Int): Int {
    return if (containsFlag(flags, flagToRemove)) {
        flags and flagToRemove.inv()
    } else {
        flags
    }
}
Julián Falcionelli
sumber
0

Menerapkan

    <item name="android:statusBarColor">@color/color_primary_dark</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>

di Theme.AppCompat.Light.DarkActionBartidak bekerja untuk saya. Apa triknya, memberi colorPrimaryDarkseperti biasa bersama android:colorPrimarydi styles.xml

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

dan dalam pengaturan

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Window window = this.Window;
                    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                }

tidak harus menetapkan warna statusbar dalam kode.

Annu
sumber