Transparente Android-Statusleiste und Aktionsleiste

97

Ich habe ein paar Nachforschungen zu diesem Thema angestellt und konnte keine vollständige Lösung finden. Schritt für Schritt und mit einigem Ausprobieren finde ich schließlich heraus, wie wir diese Ergebnisse erzielen können: ein transparentes oder farbiges Actionbarund Statusbar. Siehe meine Antwort unten.

GuilhE
quelle

Antworten:

237

Ich entwickle eine App, die auf allen Geräten mit> = API14 ähnlich aussehen muss, wenn es um die Anpassung von Aktionsleisten und Statusleisten geht. Ich habe endlich eine Lösung gefunden und da es etwas Zeit in Anspruch genommen hat, werde ich sie teilen, um einige von Ihnen zu retten. Wir beginnen mit einer Appcompat-21-Abhängigkeit.

Transparente Aktionsleiste :

values ​​/ styles.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="android:windowContentOverlay">@null</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="windowActionBarOverlay">false</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>


values-v21 / styles.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light">
    ...
</style>

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>

Jetzt können Sie diese Themen in Ihrem verwenden, AndroidManifest.xmlum anzugeben, welche Aktivitäten transparent oder farbig sein sollen ActionBar:

    <activity
            android:name=".MyTransparentActionbarActivity"
            android:theme="@style/AppTheme.ActionBar.Transparent"/>

    <activity
            android:name=".MyColoredActionbarActivity"
            android:theme="@style/AppTheme.ActionBar"/>

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Hinweis: ActionbarUm die StatusbarTransparenz zu erhalten, müssen Sie in API> = 21 auch die Transparenz erhalten . Andernfalls werden Ihre Farbstile nicht berücksichtigt und bleiben hellgrau.



Transparente Statusleiste (funktioniert nur mit API> = 19) :
Diese ist ziemlich einfach. Verwenden Sie einfach den folgenden Code:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

Aber Sie werden ein funky Ergebnis bemerken: Geben Sie hier die Bildbeschreibung ein

Dies geschieht, weil Statusbardas Layout bei Transparenz seine Höhe verwendet. Um dies zu verhindern, müssen wir nur:

LÖSUNG 1:
Fügen Sie diese Zeile android:fitsSystemWindows="true"in Ihren Container für die Layoutansicht ein, und zwar unter der Aktionsleiste:

    ...
        <LinearLayout
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            ...
        </LinearLayout>
    ...

LÖSUNG ZWEI:
Fügen Sie unserer vorherigen Methode einige Zeilen hinzu:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        View v = findViewById(R.id.bellow_actionbar);
        if (v != null) {
            int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0;
            TypedValue tv = new TypedValue();
            getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);
            paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0);
        }

        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

Wo R.id.bellow_actionbarwird die ID der Layout-Container-Ansicht von allem sein, was wir unter dem platzieren möchten Actionbar:

...
    <LinearLayout
            android:id="@+id/bellow_actionbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        ...
    </LinearLayout>
...

Geben Sie hier die Bildbeschreibung ein

Das ist es also, ich glaube, ich vergesse etwas nicht. In diesem Beispiel habe ich kein verwendet, Toolbaraber ich denke, es wird das gleiche Ergebnis haben. So passe ich meine an Actionbar:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        View vg = getActionBarView();
        getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE);

        super.onCreate(savedInstanceState);
        setContentView(getContentView());

        if (vg != null) {
            getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            getSupportActionBar().setDisplayShowCustomEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            getSupportActionBar().setDisplayUseLogoEnabled(false);
        }
        setStatusBarTranslucent(true);
    }

Hinweis: Dies ist eine abstract classErweiterung der ActionBarActivity
Hoffnung, dass es hilft!

GuilhE
quelle
9
Sie sollten wirklich android: fitSystemWindows verwenden, wenn Sie sicherstellen möchten, dass sich Ihre Ansicht nicht unter der transparenten Statusleiste befindet.
Ianhanniballake
1
Das ist völlig richtig, ich habe meinen Code überprüft und benutze ihn auch. Ich weiß nicht, dass ich es in diesem Beispiel verpasst habe. Ich werde es aktualisieren, danke!
GuilhE
4
Sie vermissen MyScreenUtils.getStatusBarHeight(this) hier die Antwort stackoverflow.com/a/3410200/1307690
Roman Nazarevych
1
Gibt es eine Möglichkeit, es durchscheinend und nicht vollständig transparent zu machen? Ich bin auf api 23
aks
6
Um Transparent StatusBar Works zu erhalten, musste ich FLAG_LAYOUT_NO_LIMITS Flag hinzufügen und den Code getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);danach einfügengetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Eduardo ER
3

Es unterstützt nach KITKAT. Fügen Sie einfach den folgenden Code in die onCreate-Methode Ihrer Aktivität ein. Es sind keine Änderungen an der Manifest-Datei erforderlich.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window w = getWindow(); // in Activity's onCreate() for instance
                w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            }
Indika Ruwan Senavirathne
quelle
9
Dies macht die Navigationsleiste auch transparent
NOlivNeto
0

Fügen Sie einfach diese Codezeilen zu Ihrer Aktivitäts- / Fragment-Java-Datei hinzu:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);
Faisal Shaikh
quelle