it-swarm.com.de

Android-Material: Die Farbe der Statusleiste ändert sich nicht

Ich entwickle eine einfache App, um das Materialdesign zu testen. Ich verwende com.Android.support:appcompat-v7:21.0.0 und meine Aktivität sieht folgendermaßen aus:

public class MyActivity extends ActionBarActivity {
   ...
}

Das Layout ist definiert als:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".MyActivity">

    <Android.support.v7.widget.Toolbar
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="128dp"
        Android:minHeight="?attr/actionBarSize"
        Android:background="?attr/colorPrimaryDark"/>
</LinearLayout>

Nun definierte ich mein Thema nach folgenden materiellen Richtlinien:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary500</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark700</item>
</style>

Ich möchte die Farbe der Statusleiste in Android 5 ändern und auf colorPrimaryDark setzen, aber ich finde den Weg nicht. Ich habe versucht mit:

getWindow().setStatusBarColor(..)

setStatusBar color ist jedoch ab Level 21 verfügbar. Warum ändere ich eine colorPrimaryDark in meinem Design und verwende appcompact? Die Statusleiste ändert ihre Farbe nicht?

53
FrancescoAzzola

Die Statusleiste ist ein Systemfenster, das dem Betriebssystem gehört. Auf Android-Geräten vor 5.0 haben Anwendungen keine Berechtigung zum Ändern der Farbe. Daher kann die AppCompat-Bibliothek dies nicht für ältere Plattformversionen unterstützen. AppCompat bietet am besten Unterstützung für das Einfärben von ActionBar und anderer gebräuchlicher UI-Widgets in der Anwendung.

60
Alex Lockwood

Während das Einfärben der Statusleiste <5.0 nicht unterstützt wird, können Sie unter 4.4 eine Problemumgehung verwenden, um eine dunklere Farbe zu erzielen:

Machen Sie die Statusleiste durchsichtig 

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

Verwenden Sie dann die AppCompat-Symbolleiste für Ihre Appbar, um sicherzustellen, dass sie in die Systemfenster passt:

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    ...
    Android:fitsSystemWindows="true"/>

Stellen Sie sicher, dass Ihre Symbolleiste als Symbolleiste Ihrer Aktivität festgelegt ist:

protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

Die Symbolleiste erstreckt sich unter der Statusleiste, und die Halbtransparenz der Statusleiste lässt sie als dunklere Sekundärfarbe erscheinen. Wenn dies nicht die gewünschte Farbe ist, können Sie mit dieser Kombination eine Ansicht unter Ihrer Statusleiste mit der Hintergrundfarbe Ihrer Wahl einfügen (obwohl sie in der Statusleiste noch dunkler ist).

Eine Art Edge-Problemumgehung wegen 4.4, aber los geht's.

59
Tom
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().setStatusBarColor(getResources().getColor(R.color.actionbar));
}

Fügen Sie diesen Code in die onCreate-Methode Ihrer Aktivität ein. Das hat mir geholfen.

39
user998953

Wie auch andere erwähnt haben, kann dies leicht gelöst werden, indem Folgendes zu onCreate () der Aktivität hinzugefügt wird:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.primary_dark));
    }

Der wichtige Punkt, den ich hier hinzufügen möchte, ist jedoch, dass in einigen Fällen die Farbe der Statusleiste nicht geändert wird. Wenn Sie beispielsweise die MikePenz-Bibliothek für Navigation Drawer verwenden, wird die Farbe der Statusleiste implizit überschrieben, sodass Sie Folgendes manuell hinzufügen müssen, damit sie funktioniert:

.withStatusBarColorRes (R.color.status_bar_color)

13
kingmehr

Die Statusleistenfarbe wird in AppCompat v7: 21.0.0 nicht unterstützt.

Aus dem Android-Entwickler-Blogbeitrag

Auf älteren Plattformen emuliert AppCompat die Farbthemen nach Möglichkeit. Im Moment ist dies auf das Einfärben der Aktionsleiste und einiger Widgets beschränkt.

Dies bedeutet, dass die AppCompat lib nur Statusleisten auf Lollipop und höher einfärbt.

9
Anup Cowkur

Wechseln Sie zu AppCompatActivity und fügen Sie in der Symbolleiste einen PaddingTop von 25 dp hinzu, und schalten Sie ihn ein 

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

Dann wird die Willensymbolleiste oben nach oben angezeigt

8
alvarlagerlof

Diese Lösung legt die Statusleistenfarbe von Lollipop, KitKat und einigen Pre-Lollipop-Geräten (Samsung und Sony) fest .. _. Der BarTintManager verwaltet die KitKat-Geräte;) 

@Override
protected void onCreate( Bundle savedInstanceState ) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    hackStatusBarColor(this, R.color.primary_dark);
}

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public static View hackStatusBarColor( final Activity act, final int colorResID ) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
        try {

            if (act.getWindow() != null) {

                final ViewGroup vg = (ViewGroup) act.getWindow().getDecorView();
                if (vg.getParent() == null && applyColoredStatusBar(act, colorResID)) {
                    final View statusBar = new View(act);

                    vg.post(new Runnable() {
                        @Override
                        public void run() {

                            int statusBarHeight = (int) Math.ceil(25 * vg.getContext().getResources().getDisplayMetrics().density);
                            statusBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, statusBarHeight));
                            statusBar.setBackgroundColor(act.getResources().getColor(colorResID));
                            statusBar.setId(13371337);
                            vg.addView(statusBar, 0);
                        }
                    });
                    return statusBar;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    else if (act.getWindow() != null) {
        act.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        act.getWindow().setStatusBarColor(act.getResources().getColor(colorResID));
    }
    return null;
}

private static boolean applyColoredStatusBar( Activity act, int colorResID ) {
    final Window window = act.getWindow();
    final int flag;
    if (window != null) {
        View decor = window.getDecorView();
        if (decor != null) {
            flag = resolveTransparentStatusBarFlag(act);

            if (flag != 0) {
                decor.setSystemUiVisibility(flag);
                return true;
            }
            else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KitKat) {
                act.findViewById(Android.R.id.content).setFitsSystemWindows(false);
                setTranslucentStatus(window, true);
                final SystemBarTintManager tintManager = new SystemBarTintManager(act);
                tintManager.setStatusBarTintEnabled(true);
                tintManager.setStatusBarTintColor(colorResID);
            }
        }
    }
    return false;
}

public static int resolveTransparentStatusBarFlag( Context ctx ) {
    String[] libs = ctx.getPackageManager().getSystemSharedLibraryNames();
    String reflect = null;

    if (libs == null)
        return 0;

    final String SAMSUNG = "touchwiz";
    final String SONY = "com.sonyericsson.navigationbar";

    for (String lib : libs) {

        if (lib.equals(SAMSUNG)) {
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND";
        }
        else if (lib.startsWith(SONY)) {
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT";
        }
    }

    if (reflect == null)
        return 0;

    try {
        Field field = View.class.getField(reflect);
        if (field.getType() == Integer.TYPE) {
            return field.getInt(null);
        }
    } catch (Exception e) {
    }

    return 0;
}

@TargetApi(Build.VERSION_CODES.KitKat)
public static void setTranslucentStatus( Window win, boolean on ) {
    WindowManager.LayoutParams winParams = win.getAttributes();
    final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    if (on) {
        winParams.flags |= bits;
    }
    else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}
2
bapho

Make Theme.AppCompa t -Stil übergeordnet

<style name="AppTheme" parent="Theme.AppCompat">
     <item name="Android:colorPrimary">#005555</item>
     <item name="Android:colorPrimaryDark">#003333</item>
</style>

Und setze getSupportActionBar().getThemedContext() in onCreate().

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        getSupportActionBar().getThemedContext();
}
0
Ausama