wake-up-neo.com

Android transparente Statusleiste und Aktionsleiste

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

91
GuilhE

Ich entwickle eine App, die auf allen Geräten mit> = API14 ähnlich aussehen muss, wenn es um die Anpassung der Aktionsleiste und der Statusleiste geht. Ich habe endlich eine Lösung gefunden und da es ein bisschen Zeit in Anspruch nahm, teile ich sie, 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 AndroidManifest.xml um festzulegen, 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"/>

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

Hinweis: Um in API> = 21 das Actionbar transparent zu machen, müssen Sie auch das Statusbar transparent machen. Andernfalls werden Ihre Farbstile nicht berücksichtigt und bleiben hellgrau.



Transparente Statusleiste (funktioniert nur mit API> = 19):
Dies ist ziemlich einfach, benutze 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 du wirst ein irres Ergebnis bemerken: enter image description here

Dies liegt daran, dass das Layout seine Höhe verwendet, wenn Statusbar transparent ist. Um dies zu verhindern, müssen wir nur:

LÖSUNG 1:
Diese Zeile hinzufügen Android:fitsSystemWindows="true" in Ihrem Layout-Ansichtscontainer, was auch immer Sie unter der Actionbar platzieren möchten:

    ...
        <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_actionbar ist die Ansichts-ID des Layout-Containers für alles, was unter dem Actionbar platziert werden soll:

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

enter image description here

Das ist es also, ich denke, ich werde nichts vergessen. In diesem Beispiel habe ich kein Toolbar verwendet, aber ich denke, es wird dasselbe Ergebnis haben. So passe ich mein Actionbar an:

@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 ein abstract class das erweitert ActionBarActivity
Ich hoffe es hilft!

231
GuilhE

Es unterstützt nach KitKat. Fügen Sie einfach den folgenden Code in die onCreate-Methode Ihrer Aktivität ein. Änderungen an der Manifest-Datei sind nicht 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);
            }