it-swarm.com.de

So ändern Sie die Farbe der Statusleiste in Android

Zunächst einmal ist es kein Duplikat wie in So ändern Sie die Hintergrundfarbe der Android-Statusleiste

Wie ändere ich die Farbe der Statusleiste, die der in der Navigationsleiste entsprechen soll?.

Ich möchte, dass die Farbe der Statusleiste der Farbe der Navigationsleiste entspricht

enter image description here

305
codercat

Aktualisieren:

Lutscher:

public abstract void setStatusBarColor (int color)

Hinzugefügt in API Level 21

Android Lollipop bietet die Möglichkeit, die Farbe der Statusleiste in Ihrer App für ein intensiveres Benutzererlebnis und im Einklang mit dem Material Design Guidelines von Google zu ändern. 

So können Sie die Farbe der Statusleiste mit der neuen Methode window.setStatusBarColor ändern, die in API level 21 eingeführt wurde. 

Das Ändern der Farbe der Statusleiste erfordert auch das Setzen von zwei zusätzlichen Flags im Fenster. Sie müssen das Flag FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS hinzufügen und das Flag FLAG_TRANSLUCENT_STATUS löschen.

Arbeitscode:

Window window = activity.getWindow();

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));

Offizielle Entwicklerreferenz: setStatusBarColor (int)

Beispiel: Materialdesign überall

Chris Banes Blog- appcompat v21: Materialdesign für Pre-Lollipop-Geräte!

enter image description here

Die transitionName für den Ansichtshintergrund lautet Android:status:background.

295
codercat

Android 5.0 Lollipop führte das Material Design-Design ein, das die Statusleiste automatisch basierend auf dem colorPrimaryDark-Wert des Designs einfärbt. 

Dies wird auf dem Gerät vor Lollipop dank der Unterstützung von Library-v7-appcompat ab Version 21 unterstützt. Blogpost über Support appcompat v21 von Chris Banes

enter image description here

Lies mehr über das Material Theme auf der offiziellen Android Developers Website

485
Giorgio

Platzieren Sie hier Ihre Werte-v21/styles.xml.

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="Android:statusBarColor">@color/color_primary</item>
    </style>
</resources>
172
Niels

dies ist eine sehr einfache Möglichkeit, dies ohne Library zu tun: Wenn die Betriebssystemversion nicht unterstützt wird - unter KitKat -, also nichts passiert . Ich mache diese Schritte:

  1. in meiner xml habe ich diese Ansicht hinzugefügt:
<View
        Android:id="@+id/statusBarBackground"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

dann habe ich diese Methode gemacht:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

sie benötigen diese beiden Methoden, um die Höhe der Aktionsleiste und Statusleiste zu erhalten:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

dann brauchen Sie nur noch diese Zeile, um die Farbe der Statusleiste einzustellen:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(Android.R.color.white));
47
itzhar

Nun, die Lösung von Izhar war OK, aber ich persönlich versuche, den Code, der so aussieht, zu vermeiden:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
//Do what you need for this SDK
};

Ich mag es auch nicht, Code zu duplizieren. In Ihrer Antwort muss ich eine solche Codezeile in allen Aktivitäten hinzufügen:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(Android.R.color.white));

Also habe ich die Lösung von Izhar genommen und XML verwendet, um dasselbe Ergebnis zu erhalten: Erstellen Sie ein Layout für die StatusBar status_bar.xml

<View xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:layout_width="match_parent"
     Android:layout_height="@dimen/statusBarHeight"
     Android:background="@color/primaryColorDark"
     Android:elevation="@dimen/statusBarElevation">

Beachten Sie die Höhen- und Höhenattribute. Diese werden in Werte, Werte-v19, Werte-v21 weiter unten festgelegt.

Fügen Sie dieses Layout mit include, main_activity.xml zu Ihrem Aktivitätenlayout hinzu:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include Android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

Fügen Sie für die Symbolleiste das obere Randattribut hinzu:

<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="?android:attr/actionBarSize"
Android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
Android:elevation="@dimen/toolbarElevation"
Android:layout_marginTop="@dimen/appBarTopMargin"
Android:textDirection="ltr"
Android:layoutDirection="ltr">

Fügen Sie in Ihrer appTheme style-v19.xml und styles-v21.xml das windowTranslucent-Attribut hinzu:

styles-v19.xml, v21:

<resources>
<item name="Android:windowTranslucentStatus">true</item>
</resources>

Und schließlich fügen Sie auf Ihren Dimens dimens-v19 und dimens-v21 die Werte für die Toolbar topMargin und die Höhe von statusBarHeight: Dimens.xml für weniger als KitKat hinzu:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

Die Höhe der Statusleiste beträgt für KitKat und darüber immer 24 dB Dimens-v19.xml:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

dimens-v21.xml für Lolipop, fügen Sie bei Bedarf einfach die Höhe hinzu:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

Dies ist das Ergebnis für Jellybean KitKat und Lollipop:

enter image description here

29
Moti Bartov

Erstellen Sie einfach ein neues Design in res/values ​​/ styles.xml , in dem Sie den "colorPrimaryDark" ändern, der die Farbe der Statusleiste ist:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

Ändern Sie das Aktivitätsthema in AndroidManifest.xml in das gewünschte Thema. Bei der nächsten Aktivität können Sie die Farbe wieder in die ursprüngliche Farbe ändern, indem Sie das ursprüngliche Design auswählen:

<activity
    Android:name=".LoginActivity"
    Android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />

        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

So sollte Ihre res/values ​​/ colors.xml aussehen:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>
17
lcompare

Wie @Niels sagte, musst du in values-v21/styles.xml platzieren:

<item name="Android:statusBarColor">@color/black</item>

Fügen Sie jedoch tools:targetApi="Lollipop" hinzu, wenn Sie einzelne styles.xml verwenden möchten, z.

<item name="Android:statusBarColor" tools:targetApi="Lollipop">@color/black</item>
15
Faisal Shaikh

Ich hatte die folgende Anforderung: Programmgesteuert die Farbe der Statusleiste ändern, um sie transparent zu halten , damit sich die Navigationsleiste über die transparente Statusleiste zeichnen kann.

Ich kann das nicht mit der API machen

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

Wenn Sie hier im Stack-Überlauf einchecken, setzen Sie vor dieser Codezeile die Transparenz der Statusleiste auf fest

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

Ich kann Farbe und Transparenz der Statusleiste folgendermaßen verwalten:

  • Android 4: Sie können nicht viel tun, da Sie die Statusleistenfarbe nicht über die API verwalten können. Sie können die Statusleiste nur als durchscheinend festlegen und ein farbiges Element Ihrer Benutzeroberfläche unter den Status verschieben Bar. Dazu müssen Sie mit spielen

    Android:fitsSystemWindows="false"
    

    in Ihrem Hauptlayout. Dadurch können Sie Ihr Layout unter der Statusleiste zeichnen. Dann müssen Sie mit etwas Polsterung oben im Hauptlayout spielen.

  • Android 5 und höher: Sie müssen einen Stil mit definieren

    <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="Android:statusBarColor">@Android:color/transparent</item>
    

    dadurch kann die Navigationsleiste die Statusleiste überlappen.

    Um die Farbe zu ändern und die Statusleiste transparent zu halten, müssen Sie die Farbe der Statusleiste mit einstellen

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))
    

    wobei drawerLayout so definiert ist

    <Android.support.v4.widget.DrawerLayout
        Android:id="@+id/drawer_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="true">
    
12
DSoldo

Sie können die Farbe der Statusleiste mit dieser Funktion ändern. funktioniert auf Android L bedeutet API 21 und höher und benötigt eine Farbzeichenfolge wie "#ffffff".

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}
11
sajad abbasi

Wenn Sie mit Android 4.4 und höher arbeiten möchten, probieren Sie dies aus. Ich beziehe mich auf Harpreets Antwort und diesen Link. Android und die transparente Statusleiste

Rufen Sie zunächst die setStatusBarColored-Methode in der onCreate-Methode von Activity auf. Ich verwende hier ein Bild. Sie können es ändern, um eine Farbe zu verwenden.

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Vor:  before

Nach dem:  after

Die Farbe der Statusleiste wurde geändert, aber die Navigationsleiste ist abgeschnitten. Daher müssen Sie den Rand oder den Versatz der Navigationsleiste in der Methode onCreate festlegen.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }

Die Statusleiste sieht dann so aus.

 status bar

5
Allan

Dies hat bei KitKat für mich funktioniert und mit guten Ergebnissen.

public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }
4
Harpreet

Bearbeiten Sie das colorPrimary in colors.xml in Values ​​mit der Farbe, die die Statusleiste sein soll. Zum Beispiel:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>

3
PhilipS

Eine weitere Lösung:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);
2
Vova K.

Sie können diesen einfachen Code verwenden:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}
1
steve moretz

Ändern Sie die colorPrimaryDark in Ihre Wunschfarbe in die Datei res/values ​​/ styles.xml

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>

Um die Farbe für obiges lolipop zu ändern, fügen Sie dieses einfach Ihrer styles.xml hinzu

<item name="Android:statusBarColor">@color/statusBarColor</item>

aber denk dran, wenn du eine helle Farbe für die Statusleiste haben willst, füge auch diese Zeile hinzu

<item name="Android:windowLightStatusBar">true</item>
0