Machen Sie die Navigationsschublade hinter der Statusleiste

Ich versuche, eine Nav-Schublade wie die aus der Material-Spezifikation (wie die von der neuen Google Mail-App) zu erstellen. Beachten Sie, wie sich der Inhalt der nav-Schublade hinter der Statusleiste befindet:

Beispiel aus der Materialspezifikation

  • Verwenden von JAVA RMI in Android-Anwendung
  • VideoView Ernte zu quadratisch
  • Android-Datenbindungen (ähnlich WPF)?
  • Wie bekomme ich den Marquee-Effekt mit der Listenansicht in reagieren?
  • Wie erstelle ich eine kreisförmige (endlose) RecyclerView?
  • Aus Benachrichtigung: AlertDialog ohne UI
  • Mit der Antwort von Chris Banes aus dieser Frage konnte ich die Navigationsschublade in meiner App erfolgreich hinter die Statusleiste ziehen lassen. Das geht gut Was nicht funktioniert, zeichnet den Inhalt der Nav-Schublade hinter der Statusleiste. Ich möchte, dass das blaue Bild in meiner Schublade hinter der Statusleiste angezeigt wird, aber dieser Bereich wird mit der Farbe der Statusleiste gezeichnet, wie in diesem Screenshot zu sehen ist.

    Meine app

    Also, wie kann ich meine Navigationsschublade im Bereich hinter der Statusleiste zeichnen? Ich habe die relevanten Teile meines Projektes unten veröffentlicht.

    Grundlayout mit der Navigationsschublade:

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/warning_container" /> <FrameLayout android:id="@+id/navigation_drawer_fragment_container" android:layout_width="300dp" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_gravity="start"> <fragment android:id="@+id/navigation_drawer_fragment" android:name="com.thebluealliance.androidclient.fragments.NavigationDrawerFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout="@layout/fragment_navigation_drawer" /> </FrameLayout> </android.support.v4.widget.DrawerLayout> 

    Thema meiner Tätigkeit

     <style name="AppThemeNoActionBar" parent="AppTheme"> <item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> 

    In onCreate() meiner Tätigkeit mache ich folgendes:

     mDrawerLayout.setStatusBarBackground(R.color.primary_dark); 

  • Bei Verwendung von getDefaultSharedPreferences und getSharedPreferences
  • So verhindern Sie einen schnellen Doppelklick auf einen Knopf
  • Benennen von Konventionen im Android SDK
  • Android Studio muss das Projekt vor jedem Lauf neu erstellen
  • Muss jede Aktivität ein Layout haben?
  • Deaktivieren Sie das Scrollen eines ListViews, das in einem ScrollView enthalten ist
  • 6 Solutions collect form web for “Machen Sie die Navigationsschublade hinter der Statusleiste”

    Für API 21+

     <style name="AppTheme" parent="android:Theme.Holo.NoActionBar.TranslucentDecor"> ... </style> 

    Für API 19+

     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:windowTranslucentStatus">true</item> </style> 

    Ihr Layout sollte android:fitsSystemWindows="false" (was der Standard ist).


    Jetzt, da du die Transluzenz umschalten willst, kannst du es programmatisch machen:

     Window window = getWindow(); // Enable status bar translucency (requires API 19) window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Disable status bar translucency (requires API 19) window.getAttributes().flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Set a color (requires API 21) window.setStatusBarColor(Color.RED); 

    Ich verlasse die ganze Sdk-Version, die dich überprüft 🙂


    Ss

     <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <include layout="@layout/toolbar" /> <!-- Main layout --> <FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <!-- Nav drawer --> <fragment android:id="@+id/fragment_drawer" android:name="com.example.DrawerFragment" android:layout_width="@dimen/drawer_width" android:layout_height="match_parent" android:layout_gravity="left|start" android:fitsSystemWindows="true" /> </android.support.v4.widget.DrawerLayout> 

    Werte / themes.xml

     <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@color/primary</item> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:textColorPrimary">@color/textColorPrimary</item> </style> <style name="AppTheme" parent="AppTheme.Base"> </style> 

    Werte-v19 / themes.xml

     <style name="AppTheme" parent="AppTheme.Base"> <!--This makes the status bar transparent in KK and Lollipop--> <!--You do not need values-v21 and if you create them make sure you extend from this one--> <item name="android:windowTranslucentStatus">true</item> </style> 

    Wenn du die Farbe (anders als transparent schwarz) der Statusleiste ändern möchtest, musst du für den anderen Ansatz mit der benutzerdefinierten Ansicht gehen, denn mDrawerLayout.setStatusBarBackgroundColor(int) wird nur aktiviert, wenn diese DrawerLayout passtSystemWindows ( android:fitsSystemWindows="true" ), und wenn du es tust, wird es nicht hinter die Statusleiste gezogen, sondern darunter.

    Ich fand den besten Weg, dies auf Android 5.0 zu tun. Der Schlüssel ist, ein ScrimInsetFrameLayout als das Wurzel-Element der Navigations-Schublade zu verwenden (die zweite Ansicht in der DrawerLayout ). Dadurch wird der Inhalt erweitert, um den Platz hinter der Statusleiste zu füllen. Um das Einfügen richtig zu färben, können Sie das folgende Attribut auf dem ScrimInsetFrameLayout :

     app:insetForeground="#4000" 

    Auch stellen Sie sicher, dass Sie android:fitsSystemWindows="true" auf dem Scrim Layout!

    Der Quellcode für das ScrimInsetFrameLayout finden Sie hier: https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout .Java

    In Ihrem Verzeichnis "values-v21" fügen Sie diese Zeilen hinzu:

     <style name="AppTheme" parent="BaseTheme"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowSharedElementsUseOverlay">false</item> </style> 

    Fügen Sie einfach diese beiden Werte zu Ihrem Thema Stil in Werte-v21

     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> .. <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> 

    Für alle, die mit einer lichtdurchlässigen statusBar in Kombination mit einer navBar kämpfen, aber nicht bereit, <style name="yourAppTheme" parent= zu "android:Theme.Holo.NoActionBar.TranslucentDecor" , füge einfach diese Zeilen in dein style.xml hinzu:

      <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:windowContentOverlay">@null</item> 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.