AppCompat ActionBarActivity ile durum çubuğu rengini değiştirme


146

Etkinliklerimden birinde, Araç Çubuğu rengini kullanarak değiştirdim Palette. Ama kullanılarak 5.0 cihazlarda renk Sesimin rengi Ben 2 çok farklı renklere sahip ve iyi görünmüyor yani benim etkinlik tema.ActionBarActivitystatus barcolorPrimaryDark

5.0'da kullanabileceğinizi biliyorum Window.setStatusBarColor()ama buna ActionBarActivitysahip değil.

bu yüzden sorum 5.0'da, durum çubuğu rengini nasıl değiştirebilirim ActionBarActivity?


SystemBarTint lib'i kullanmaya çalıştınız mı? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

Yanıtlar:


420

Sorunu anladığımdan emin değilim.

Ben programlı durum çubuğu rengini değiştirmek istiyorum (ve Android 5.0 sahiptir cihazı sağlanan) o zaman yapabilirsiniz kullanabilirsiniz Window.setStatusBarColor(). Etkinliğin Activityveya kaynağından türetilmiş olması fark yaratmamalıdır ActionBarActivity.

Yapmayı deneyin:

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

Sadece bunu ile test ActionBarActivityettim ve iyi çalışıyor.


Not: Stiller dosyanız önceden ayarlanmışsa, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSbayrağı programlı olarak ayarlamak gerekli değildir values-v21:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>

1
ah ok getWindow()
Kullanmıyordum

LOLLIPOP kodu eski androidlerde bulunmadığında bu kilitlenir. kullanmak en iyisi> = 21
code511788465541441

12
@ code578841441 Aslında bu olmamalı. Derleme yapılırken sabitler satır içine alınır.
matiash

4
@ code578841441: Bunun nedeni daha eski bir SDK ile derlemiş olmanızdır. Daha eski API sürüm kısıtlamalarınız olsa bile (ör. Ve / veya öğedeki öznitelikler ) bile her zaman en son Android SDK ile derlemek için çaba göstermelisiniz . minSdkVersiontargetSdkVersion<uses-sdk ...>
dbm

3
Ayrıca getWindow () çağırmak zorunda kaldım. AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); nasıl çalışır
Philipp E.

61

Durum çubuğu rengini değiştirmenin çeşitli yolları vardır.

1) styles.xml dosyasını kullanma. Bunu kolay ama statik bir şekilde yapmak için android: statusBarColor özniteliğini kullanabilirsiniz.

Not: Bu özelliği Malzeme temasıyla da kullanabilirsiniz.

<?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) Window sınıfındaki setStatusBarColor (int) yöntemini kullanarak dinamik olarak yapabilirsiniz. Ancak bu yöntemin yalnızca API 21 veya üstü için kullanılabildiğini unutmayın. Bu yüzden kontrol ettiğinizden emin olun, aksi takdirde uygulamanız daha düşük cihazlarda kilitlenir.

İşte bu yöntemin çalışan bir örneği.

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

Burada birincilDark, uygulamamda kullandığım birincil rengin 700 tonu. Bu rengi colors.xml dosyasında tanımlayabilirsiniz.

Bir deneyin ve herhangi bir sorunuz varsa bana bildirin. Umarım yardımcı olur.


window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) gibi görünüyor; gerekli değil - ama bu benim için çalıştı
bkurzius

Programlı sürümün neden işe yarayacağına dair bir fikir, ancak stil sürümü işe yaramadı mı?
Andrew

Benim durumumda aktivitenin stili flah translucent_status ayarlanmıştı, bu yüzden window.clearFlags komutu olmadan işe yaramadı. Bunun için teşekkürler!
15'te BMacedo

Vay canına! Bu cevap kabul edilmelidir, clearFlagssorunumu düzelt eklemek
fanjavaid

9

Durum çubuğu renginin henüz AppCompat'ta uygulandığını düşünmüyorum. Bunlar mevcut özelliklerdir:

    <!-- ============= -->
    <!-- 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" />

( \ Sdk \ extras \ android \ support \ v7 \ appcompat \ res \ değerleri \ attrs.xml'den )


1
Eski işletim sistemi sürümleri durum çubuğunu değiştirme yeteneği sağlamazsa, hiçbir zaman AppCompat'ta uygulanmayabilir.
TheIT

2
<attr name = "colorPrimaryDark" format = "renk" /> <! - Birincil markalama renginin koyu çeşidi. Varsayılan olarak, bu durum durum çubuğuna (statusBarColor aracılığıyla) ve gezinme çubuğuna (navigationBarColor aracılığıyla) uygulanan renktir. ->
Soheil Setayeshi

3

Bunu deneyin, bunu kullandım ve v21 ile çok iyi çalışıyor.

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

1

Yukarıdaki cevaplar için teşekkürler, bunların yardımıyla, xamarin.android MVVMCross uygulaması için belirli Ar-Ge'den sonra, aşağıda çalıştı

OnCreate yöntemindeki etkinlik için belirtilen işaret

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

Her MvxActivity için Tema aşağıda belirtilmiştir

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

SplashStyle.xml dosyam aşağıdaki gibi görünüyor

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

V7 uygulamamız var.


1

[Kotlin version] İstenen rengin Sistem Durum Arabirimini gizlemek için yeterli durum kontrastına sahip olup olmadığını, Pil Durumu Simgesi, Saat vb.Gibi kontrol eden bu uzantıyı oluşturdum, böylece Sistem Kullanıcı Arayüzünü buna göre beyaz veya siyah olarak ayarladık.

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

0

uygulama

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

içinde Theme.AppCompat.Light.DarkActionBarbenim için çalıştı olmadı. Hile ne oldu, colorPrimaryDarkher zamanki gibi android:colorPrimarystyles.xml içinde vermek

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

ve ortamda

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

kodda durum çubuğu rengini ayarlamak zorunda değildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.