Navigation Schublade halbtransparent über Statusleiste funktioniert nicht

? Boardy @ | Original: StackOverFlow

Ich bin auf Android -Projekt arbeiten, und ich bin der Umsetzung der Navigation Schublade . Ich bin durch die neue http://www.google.com/design/spec/patterns/navigation-drawer.html und das Lesen der bereits http://android-developers.blogspot.co.uk/2014/10/material-design -on- android - checklist.html . Die Spezifikation sagt, dass die Folie aus Scheibe sollte über alles einschließlich der Statusleiste schweben und halbtransparent über der Statusleiste.

Mein Navigationsleiste über der Statusleiste, aber seine jegliche Transparenz nicht bekam . Ich habe den Code aus diesem SO Post gefolgt, wie oben in der Google -Entwickler Blog Spot, Link empfohlen http://stackoverflow.com/questions/26440879/how-do-i-use-drawerlayout-to-display-over-the-actionbar-toolbar-and-under-the-st/26440880 .

Unten ist mein XML -Layout

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <android.support.v7.widget.Toolbar
            android:id="@+id/my_awesome_toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/appPrimaryColour" />
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout"
        android:layout_width="304dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:fitsSystemWindows="true"
        android:background="#ffffff">
        <ListView android:id="@+id/left_drawer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"></ListView>
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

Unten ist mein Apps Thema

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/appPrimaryColour</item>
        <item name="colorPrimaryDark">@color/appPrimaryColourDark</item>
        <item name="colorAccent">@color/appPrimaryColour</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionModeOverlay">true</item>

    </style>

Unten ist mein Apps v21 Thema

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/appPrimaryColour</item>
    <item name="colorPrimaryDark">@color/appPrimaryColourDark</item>
    <item name="colorAccent">@color/appPrimaryColour</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Unten ist mein onCreate Verfahren

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    mDrawerLayout = (DrawerLayout)findViewById(R.id.my_drawer_layout);
    mDrawerList = (ListView)findViewById(R.id.left_drawer);

    mDrawerLayout.setStatusBarBackgroundColor(
        getResources().getColor(R.color.appPrimaryColourDark));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        LinearLayout linearLayout = 
            (LinearLayout)findViewById(R.id.linearLayout);
        linearLayout.setElevation(30);
    }

Unten ist ein Screenshot von meinem Navigations Schublade, die die Oberseite nicht halbtransparent

Navigation Schublade halbtransparent über Statusleiste funktioniert nicht

Top 5 Antwort

1mroczis @

Alles was Sie tun müssen, ist, eine semitransparente Farb für Statusleiste verwenden . Fügen Sie die folgenden Zeilen in Ihre v21 Thema :

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/desired_color</item>

Vergessen Sie nicht, dass color ( Ressourcen ) müssen im Format #AARRGGBB sein . Dies bedeutet, dass die Farbe wird auch die Alpha-Wert .

2Michele La Ferla @

Warum nicht etwas ähnliches wie das benutzen?

<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

    <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#80111111"/>
</android.support.v4.widget.DrawerLayout>
3markus-hi @

Sie müssen Ihrem Navigations Schublade Layout in einem ScrimLayout wickeln .

Ein ScrimLayout zieht grundsätzlich eine halbtransparente Rechteck über Ihr Navigations Schublade Layout. So rufen Sie die Größe des Einsatzes einfach überschreiben fitSystemWindows in Ihrem ScrimLayout .

@Override
protected boolean fitSystemWindows(Rect insets) {
    mInsets = new Rect(insets);
    return true;
}

Später überschreiben onDraw, um eine halbtransparente Rechteck zu zeichnen .

ein https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java Umsetzung in der Google IO App Quelle gefunden werden.  https://github.com/google/iosched/blob/master/android/src/main/res/layout/navdrawer.xml Sie sehen können, wie es in der Layout- XML verwendet .

4fdsilva @

Ich hatte ein ähnliches Feature in meinem Projekt zu implementieren. Und meiner Schublade transparent i verwenden Sie einfach das zu machen, http://stackoverflow.com/questions/5445085/understanding-colors-in-android-6-characters/11019879#11019879 . Mit 6 Hex-Ziffern, haben Sie 2 Hex-Ziffern für jeden Wert von Rot, Grün und Blau sind. aber wenn man zwei zusätzliche Ziffern (8 Hex-Ziffern ), so dass Sie ARGB ( zwei Stellen für Alpha-Wert ) ( haben http://stackoverflow.com/questions/5445085/understanding-colors-in-android-6-characters/11019879#11019879 ) .

Hier sind die Hex Deckkraft Werte: für die 2 weiteren Ziffern

100% — FF

95% — F2

90% — E6

85% — D9

80% — CC

75% — BF

70% — B3

65% — A6

60% — 99

55% — 8C

50% — 80

45% — 73

40% — 66

35% — 59

30% — 4D

25% — 40

20% — 33

15% — 26

10% — 1A

5% — 0D

0% — 00

Für exemple : wenn Sie de Hex Farbe ( # 111111 ) haben setzen Sie einfach eine der Deckkraftwerte, um die Transparenz zu erhalten. wie folgt aus: (# 11.111.100 )

Meine Schublade nicht die Aktionsleiste (wie Sie) ab, sondern die Transparenz kann auch in diesen Fällen angewendet werden. Hier ist mein Code :

     <ListView
          android:id="@+id/left_drawer"
          android:layout_width="240dp"
          android:layout_height="match_parent"
          android:layout_gravity="start"
          android:background="#11111100"
          android:choiceMode="singleChoice"
          android:divider="@android:color/transparent"
          android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

Und hier ist ein weiteres http://stackoverflow.com/questions/15852122/hex-transparency-in-colors die Ihnen helfen, die alpha -Codes in Hex- Farben zu verstehen.

5xip @

Ihre Statusleiste Hintergrund ist weiß, der Hintergrund Ihrer Schublade Linearlayout . Warum ? Sie sind Einstellungen fitsSystemWindows = "true" für Ihre DrawerLayout und der Linearlayout Inneren. Dies bewirkt, dass Ihre Linearlayout hinter der Statusleiste zu erweitern (die transparent ist ) . So machen Sie den Hintergrund für die Schublade Teil der Statusleiste weiß.

" __rsm__ " Wenn Sie nicht möchten, dass Ihre Schublade hinter der Statusleiste erweitern ( wollen einen halbtransparenten Hintergrund für die ganze Statusleiste haben ), können Sie zwei Dinge tun:

1) Sie können einfach entfernen Sie alle Hintergrundwert von Ihrem Linearlayout und die Farbe der Hintergrund Ihrer Inhalte in seinem Inneren. oder

2) Sie können von Ihrem Linearlayout entfernen fitsSystemWindows="true" . Ich denke, das ist ein logischer und sauberer Ansatz . Sie werden auch zu vermeiden, dass ein Schatten unter der Statusleiste, in der Sie Ihr Navigations Schublade erstreckt sich nicht gegossen.

" __rsm__ " Wenn Sie die Schublade hinter der Statusleiste erweitern wollen und haben eine semi-transparente, Statusleiste Größe Overlay, Sie verwenden können, https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java als Container für Ihre Schublade Inhalt ( Listview ) und stellen Sie die Statusleiste Hintergrund mit app:insetForeground="#4000" . Natürlich können Sie ändern #4000, was Sie wollen . Vergessen Sie nicht, hier zu bleiben fitsSystemWindows="true" !

Oder wenn Sie nicht möchten, dass Ihre Inhalte überlagern und nur eine Farbe angezeigt werden, können Sie einfach den Hintergrund Ihres Linearlayout, was Sie wollen . Vergessen Sie nicht, den Hintergrund der Inhalt separat obwohl gesetzt !

Navigation Schublade halbtransparent über Statusleiste funktioniert nicht