Android, Wie, um eine transparente Statusleiste richtig machen

? Sandak @ | Original: StackOverFlow
---

Ich versuche, transparente Statusleiste auf Android 4.4+ machen Ich weiß, wie man durch die Definition von meinen eigenen Stil es transparent zu machen :

<style name="Theme.MyTheme" parent="Theme.MyTheme.Base">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item> </style>

Ich fand hier:  http://stackoverflow.com/a/20573595/2633630

Das Problem ist, dass, wenn Statusleiste transparent ist, ist es nicht die Farbe der Aktionsleiste und die Aktivität im Hintergrund passen gesehen :  Android, Wie, um eine transparente Statusleiste richtig machen

So fand ich, dass ich android verwenden : fitsSystemWindows = "true" und Android: clipToPadding = "false" in meinem Layout, das ich hier http://mindofaandroiddev.wordpress.com/2013/12/28/making-the-status-bar-and-navigation-bar-transparent-with-a-listview-on-android-4-4-kitkat/

<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"
android:background="@color/background_darkRed"
android:fitsSystemWindows="true"
android:clipToPadding="false"    
tools:context="com.sandak.......">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 
....

Das löst das Problem mit transparenten oberen Statusleiste und sieht ok .. Leider gibt es Probleme an der Unterseite auf der " Navigationsleiste " mit den Systemtasten, die rot und nicht transparent ist, was ich will :  Android, Wie, um eine transparente Statusleiste richtig machen

Ich habe alle möglichen Varianten zu erreichen versuchen Arbeitsergebnis, aber ich kann nicht herausfinden, wie es zu lösen . Meine einzige Arbeitslösung wird oben Polsterung über 60dp zum Root-Element gesetzt . Aber diese Lösung ist hässlich und auf verschiedenen Geräten können anders aussehen und kann nicht arbeiten.

Ich fand ein paar Anwendungen, die auf Google Play, die mit transparentem Hintergrund arbeiten Ok, also ich bin neugierig, wie sie damit es funktioniert.

Zum Beispiel:  https://play.google.com/store/apps/details?id=com.trello und einige andere

---

Top 5 Antwort

1Sandak @

// UPDATE : Ok, das ist ziemlich alt Antwort. Jetzt können Sie Werkstoff Thema zu verwenden, damit umzugehen und es ist ziemlich einfach. Stellen Sie einfach den Ziel api 21+, verwenden Sie Support-Bibliothek, wenn Sie benötigen, und erstellen Thema mit Material Thema, wo Sie können Statusleiste Farbe direkt angeben

<style name="AppTheme"
        parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- colorPrimary is used for the default action bar background -->
        <item name="colorPrimary">@color/color_primary</item>

        <!-- colorPrimaryDark is used for the status bar -->
        <item name="colorPrimaryDark">@color/color_primary_dark</item>

        <!-- colorAccent is used as the default value for colorControlActivated
             which is used to tint widgets -->
        <item name="colorAccent">@color/accent_orange</item>
    </style>

================================================== =====================

OLD ANSWER:

Ok, Es scheint, dass ich mein Problem lösen . Es ist nicht die beste und klarste Lösung, aber es funktioniert Lösung . Wenn jemand in der Zukunft herausfinden, bessere und klare Lösung, lass es mich wissen und ich werde meine Antwort zu aktualisieren / oder markieren Sie Ihre Antwort als richtig ein . Aber jetzt habe ich keine bessere Lösung als diesem kleinen Hack :

Das Stammelement des Layouts muss RelativeLayout sein . Als sollten Sie Ihre wichtigsten Layout wie Scroll oder jede Art von anderen Layouts zu folgen, ist es egal . Am Ende vor dem Schließen Relative Layout- Tag folgt leer Linearlayout, die den gleichen Hintergrund wie Ihr Aktionsleiste und feste Höhe (Höhe der Statusleiste ) gesetzt wurde.

<RelativeLayout 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="com.sandak....">
<ScrollView
    android:fitsSystemWindows="true"
    android:clipToPadding="false"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
.... all your main views etc..
</ScrollView>
<LinearLayout
        android:id="@+id/statusBarBackgroundLinearLayout"
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="30dp"
        android:background="@color/background_darkRed"
        android:clickable="false"
        android:focusable="false">
     </LinearLayout>
</RelativeLayout>

Ok, dann müssen Sie im Code die gleiche Linear -Layout Höhe eingestellt, wie die Statusleiste besitzt :

private void setStatusBarBackground(View rootView) {
        getStatusBarLayout(rootView);
        statusBarHeight = getStatusBarHeight();
        setStatusBarLayoutHeight(statusBarHeight);
    }

    private void getStatusBarLayout(View rootView){
        statusBarBackgroundLinearLayout = (LinearLayout) rootView.findViewById(R.id.statusBarBackgroundLinearLayout);
        if (isPreKitkatDevice()) {
            hideStatusBarLayout();
        }
    }

    private int getStatusBarHeight() {
        int statusBarHeight = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
        return statusBarHeight;
    }

    private boolean isPreKitkatDevice(){
        return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT;
    }

    private void hideStatusBarLayout(){
        statusBarBackgroundLinearLayout.setVisibility(View.INVISIBLE);
    }        

    private void setStatusBarLayoutHeight(int height){
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) statusBarBackgroundLinearLayout.getLayoutParams();
        layoutParams.height = height;
    }

Und dann rufen setStatusBarBackground in Ihrem onCreate () -Methode. Das ist Arbeitslösung für alle andere Art von deviceas . Für Geräte, bei denen vor KitKat transparenten Hintergrund ist nicht zulässig, müssen Sie die Linear -Layout zu verstecken.