8

In dieser App, die ich baue, habe ich ein Navigations-Schublade-Fragment in meine Tätigkeit aufgenommen. Ich benutze 5.0, also konnte ich primaryColor und primaryColorDark setzen, um die richtigen Farben zu erhalten. Ich habe mich entschieden, meine Nav-Schublade so zu gestalten, dass sie der Schublade von Google Now in 5.0 sehr ähnlich ist, wo die Nav-Schublade ihren eigenen Hintergrund für die Statusleiste hat. (Kann nicht Bilder posten, nicht genug Ruf>.>)Coloring Android Statusleiste in Nav-Schublade

Ich habe die Empfehlungen dieser Frage here gefolgt, die ziemlich geholfen hat. Ich habe es geschafft, mein Nav Drawer unter der Statusleiste zu zeichnen, wenn ich es herausziehe. Nur Ärger ist, ich kann nicht herausfinden, wie die Farbe der Statusleiste eingestellt wird, die in meiner Schublade angezeigt wird. Derzeit wird nur Weiß angezeigt.

Hier sind die entsprechenden Bits meines Designs und Code:

Aktivität Layout:

<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" 
    tools:context=".Main" 
    android:fitsSystemWindows="true"> 

    <!-- main content --> 
    ... 

    <!-- Drawer fragment --> 
    <fragment 
     android:id="@+id/navigation_drawer" 
     android:layout_width="@dimen/navigation_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="left|start" 
     android:theme="@style/DrawerTheme" 
     android:fitsSystemWindows="true" 
     android:choiceMode="singleChoice" 
     android:name="com.myname.appname.NavigationDrawerFragment" 
     tools:layout="@layout/fragment_navigation_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

Fragment Layout:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/navDrawerFragment" 
    android:theme="@style/DrawerTheme" 
    android:background="@color/WindowBackground" 
    tools:context=".NavigationDrawerFragment" 
    android:fitsSystemWindows="true"> 

    <!-- content here --> 

</RelativeLayout> 

Per Link oben, Farbe meiner Statusleiste Einstellung für die Aktivität (dieser Teil funktioniert ordnungsgemäß):

public void onCreate(Bundled savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // .... 

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.START); 
    drawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); 

    // .... 
} 

Und schließlich, meine zugehörigen Stile für die Aktivität, und was ich 'versucht' habe, um das Fragment zuzuordnen.

<style name="StatusBarActivityTheme" parent="MyAppTheme"> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
    <item name="android:statusBarColor">@android:color/transparent</item> 
</style> 


<style name="DrawerTheme" parent="MyAppTheme"> 
    <item name="android:statusBarColor">#000000</item> 
    <item name="android:colorPrimaryDark">#000000</item> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
</style> 

Vielen Dank im Voraus für jede Hilfe, die Sie mir schicken können! Ich vermute, dass mein Problem damit zu tun hat, dass der Hauptbildschirm von Google Now über eine transparente Statusleiste verfügt und diese nur während der Nav-Schublade einfärbt, aber jede gegenteilige Nachricht wäre großartig!

+0

R.color.colorPrimaryDark referenziert einen Farbwert aus Ihrer App-XML, nicht das android: colorPrimaryDark-Designattribut. Was haben Sie @ color/colorPrimaryDark wie in Ihren res-Dateien definiert? – alanv

+0

Ich habe @ color/colorPrimaryDark auf eine Hex-Farbe festgelegt, kann mir nicht vorstellen, es von der Spitze meines Kopfes. Dieser Teil funktioniert - es färbt die Statusleiste der Aktivität (Schublade) korrekt ein. Ich mache mir mehr Sorgen um die Fragmentschublade. (Ich wünschte wirklich, ich könnte einige Screencaps posten, aber das ist mein erster Beitrag ...) – Andrew

+0

DrawerLayout.setStatusBarBackgroundColor() ist der richtige Methodenaufruf, um die Farbe der Statusleiste der Schublade festzulegen. Sie müssen kein spezielles Thema festlegen. Wird getResources(). GetColor (R.color.colorPrimaryDark) in Weiß aufgelöst? – alanv

Antwort

17

Mit dem Setup Sie haben, ist die Nav Schublade einfach eine Ansicht, die Hintergrundzeichnung (die Sie als android:background="@color/WindowBackground" definiert haben), die unterhalb der Statusleiste (die Farbe, von denen Sie über Ihre StatusBarActivityTheme auf transparent gesetzt haben). Das System sieht nur so weit wie das Aktivitätsthema aus, um die Farbe der Statusleiste festzulegen. das Zuweisen von android:statusBarColor zu einem Kind hat keine Auswirkung.

würde die einfache Lösung für Layout ändert Ihr Nav Drawer Fragments android:background auf die Farbe der Sie wünschen. Wenn Sie wünschen, dass der Teil unterhalb Ihres Bildes weiß bleibt, wäre es eine Option, eine leere Ansicht in Ihrem Schubladenlayout mit android:background="@color/WindowBackground" oder einer anderen Farbe hinzuzufügen.


Wenn Sie den Inhalt in Ihrem Nav Fach wünschen unterhalb der Statusleiste zu erweitern, erfordert es ein bisschen mehr Arbeit. Der Grund für den Offset ist, dass Sie das Attribut android:fitsSystemWindows auf "True" setzen, wodurch wiederum der Standard der Ansicht fitSystemWindows() aufgerufen wird. Wie die Dokumentation erklärt, verwendet diese Methode den Inset (d. H. Die Höhe der Statusleiste in unserem Fall) und wendet sie als Padding der Ansicht an (in Ihrem Fall wird dies zum obersten Padding für das RelativeLayout Ihres Nav-Drawer-Fragments).

Eine Möglichkeit, diese Auffüllung zu umgehen, besteht darin, die Methode der Ansicht zu überschreiben. Ich leite Sie zu der Open-Source-IO-Schedule-App von Google - speziell verwendeten sie die ScrimInsetsScrollView als Root-Element in ihrem Nav Drawer.Diese modifizierte ScrollView wendet ein Gelege einer Farbe Ihrer Wahl an (eingestellt über das benutzerdefinierte Attribut app:insetForeground) und verbraucht den Einsatz, d. H. Keine Polsterung mehr!

Die ScrimInsetsScrollView kann als Modell verwendet werden, um Ihre eigene Version für jeden View-Nachkomme zu schreiben, wirklich - sehen Sie die nahezu identische ScrimInsetsFrameLayout.

+1

Vielen Dank! Ich habe die Antwort verbessert, aber ich habe nur noch 3 Wiederholungen. – Andrew

+0

Danke für die Erklärung, wie es funktioniert! – aluxian

+0

Danke, ich habe den Hintergrund der Hauptansicht der Navigationsleiste aktualisiert und es hat funktioniert :) – Peter