Ich habe in der neuen Side Nav-Spezifikation für Materialdesign gesehen, dass Sie die Schublade über der Aktionsleiste und hinter der Statusleiste anzeigen können. Wie kann ich das umsetzen?
android
navigation-drawer
android-appcompat
Chris Banes
quelle
quelle
Antworten:
Neue Funktionen im Framework und Support-Bibliotheken ermöglichen genau dies. Es gibt drei "Puzzleteile":
fitsSystemWindows
so dass es hinter den Systemschienen verlegt geführt wird.Theme.Material
die normale Farbe der Statusleiste, damit DrawerLayout stattdessen dort zeichnen kann.Ich gehe davon aus, dass Sie den neuen Appcompat verwenden werden.
Zunächst sollte Ihr Layout folgendermaßen aussehen:
Dann in Ihrer Aktivität / Fragment:
Dann müssen Sie sicherstellen, dass das DrawerLayout hinter der Statusleiste sichtbar ist. Sie tun dies, indem Sie Ihr Werte-v21-Thema ändern:
values-v21 / theme.xml
Hinweis: Wenn a
<fragment android:name="fragments.NavigationDrawerFragment">
anstelle von verwendet wirdIm tatsächlichen Layout wird der gewünschte Effekt erzielt, wenn Sie
fitsSystemWindows(boolean)
eine Ansicht aufrufen , die Sie von deronCreateView
Methode zurückgeben.quelle
DrawerLayout
muss hinter den Systemstangen angeordnet werden. Sie müssen es dann in der Schubladenansicht so einstellen, dassDrawerLayout
es in den Fenstereinlagen angeordnet ist.layout_marginTop
im Stammverzeichnis Ihres Schubladeninhalts tatsächlich ein Negativ verwenden . Andernfalls wird der Hintergrund des Layouts Ihres Schubladeninhalts über der Statusleiste gezeichnet und alles andere wird nach unten gedrückt. Dies scheint jedoch eine ziemlich grobe Lösung zu sein, soweit ich weiß, gibt es keine? Attr / statusBarSize oder ähnliches von Android.BEARBEITEN: Die neue Design Support Library unterstützt dies und die vorherige Methode ist nicht mehr erforderlich.
Dies kann jetzt mit der neuen Android Design Support Library erreicht werden .
Sie können die Cheesesquare-Beispiel-App von Chris Banes sehen, die alle neuen Funktionen demonstriert .
Vorherige Methode:
Da es keine vollständige Lösung gibt, habe ich hier das gewünschte Ergebnis erzielt.
Fügen Sie zunächst ein ScrimInsetsFrameLayout in Ihr Projekt ein.
Erstellen Sie dann ein Styleable, damit das eingestellt werden
insetForeground
kann.values / attrs.xml
Aktualisieren Sie die XML-Datei Ihrer Aktivität und stellen Sie sicher, dass
android:fitsSystemWindows
sowohl aufDrawerLayout
als auch auf true gesetzt istScrimInsetsFrameLayout
.layout / activity_main.xml
Legen Sie innerhalb der onCreate-Methode Ihrer Aktivität die Hintergrundfarbe der Statusleiste im Schubladenlayout fest.
MainActivity.java
Aktualisieren Sie abschließend das Thema Ihrer App so, dass
DrawerLayout
es sich hinter der Statusleiste befindet.values-v21 / styles.xml
Ergebnis:
quelle
Mit der Veröffentlichung der neuesten Android Support Library (Version 22.2.0) haben wir eine Design Support Library und als Teil eine neue Ansicht namens NavigationView . Anstatt alles alleine mit
ScrimInsetsFrameLayout
all den anderen Dingen zu machen, verwenden wir einfach diese Ansicht und alles ist für uns erledigt.Beispiel
Schritt 1
Fügen Sie das
Design Support Library
Ihrerbuild.gradle
Datei hinzuSchritt 2
Fügen Sie das
NavigationView
zu Ihrem hinzuDrawerLayout
:Schritt 3
Erstellen Sie eine neue Menü-Ressource in
/res/menu
und fügen Sie die Elemente und Symbole hinzu, die Sie anzeigen möchten:Schritt 4
Starten Sie die Navigationsansicht und behandeln Sie Klickereignisse:
Schritt 5
Achten Sie darauf, Satz
android:windowDrawsSystemBarBackgrounds
undandroid:statusBarColor
invalues-v21
sonst Ihre Schublade gewann `t angezeigt werden„unter“der StatusBarOptionaler Schritt
Fügen Sie der Navigationsansicht eine Kopfzeile hinzu. Dazu erstellen Sie einfach ein neues Layout und fügen
app:headerLayout="@layout/my_header_layout"
es der Navigationsansicht hinzu.Ergebnis
Anmerkungen
colorPrimary
Attribut definierte FarbetextColorPrimary
textColorSecondary
Sie können auch die Beispiel-App von Chris Banes überprüfen, die die Navigationsansicht zusammen mit den anderen neuen Ansichten, die Teil der Design Support Library sind (wie FloatingActionButton , TextInputLayout , Snackbar , TabLayout usw.) , hervorhebt .
quelle
<item name="itemTextColor">@color/YOUR_COLOR</item>
<item name="itemIconTint">@color/YOUR_COLOR</item>
Toolbar
- es gibt keine Möglichkeit, dies mit einemActionBar
mDrawerLayout.openDrawer(GravityCompat.START);
Sie einfach an, wo immer Sie wollen. Wenn Sie einen verwenden,ActionBarDrawerToggle
sollte dies automatisch erfolgen, sobald Sie auf das Hamburger-Symbol klicken.Damit es funktioniert, muss in values-v21-Stilen oder Theme-XML dieses Attribut verwendet werden:
<item name="android:windowTranslucentStatus">true</item>
Das macht die Magie!
quelle
Die vor allem Ansätze sind korrekt und können funktionieren. Ich habe eine funktionierende Demo gemäß der obigen Anleitung erstellt und auf 2.x bis 5.x getestet
Sie können von Github klonen
Das Wichtigste zum Herumspielen ist die Hauptaktivität
und der Rückruf
Absolut das Theme für V21 macht die Magie
und das ScrimInsetsFrameLayout
Mit der neuen Design Support-Bibliothek wird dies jetzt einfacher
Klon von @Chris Banes https://github.com/chrisbanes/cheesesquare
quelle
Alle hier genannten Antworten sind zu alt und zu lang. Die beste und kurze Lösung, die mit der neuesten Navigationsansicht funktioniert, ist
Dadurch wird die Farbe Ihrer Statusleiste beim Öffnen der Schublade in transparent geändert
Wenn Sie jetzt die Schublade schließen, müssen Sie die Farbe der Statusleiste wieder auf dunkel ändern. So können Sie dies tun.
und dann im Hauptlayout eine einzelne Zeile hinzufügen, dh
und Ihr Schubladenlayout wird so aussehen
und Ihre Navigationsansicht wird so aussehen
Ich habe es getestet und es funktioniert voll. Ich hoffe, es hilft jemandem. Dies ist vielleicht nicht der beste Ansatz, aber es funktioniert reibungslos und ist einfach zu implementieren. Markiere es, wenn es hilft. Glückliche Codierung :)
quelle
Ich verwende die Design Support Library. Und nur durch die Verwendung eines benutzerdefinierten Themas habe ich beim Öffnen der Navigationsleiste eine transparente Statusleiste erreicht.
Fügen Sie schließlich ein Thema in die Manifest-Datei ein
Vergessen Sie nicht, die Eigenschaft
android:fitsSystemWindows="true"
in "DrawerLayout" zu verwenden.quelle
Dies ist die einfachste und hat bei mir funktioniert:
In den Werten-21:
In den Werten:
Und stellen Sie Ihre Symbolleiste ein
quelle
24dp
für den oberen Rand verwendet.Anstatt die
ScrimInsetsFrameLayout
... Ist es nicht einfacher, einfach eine Ansicht mit einer festen Höhe24dp
und einem Hintergrund von hinzuzufügenprimaryColor
?Ich verstehe, dass dies das Hinzufügen einer Dummy-Ansicht in der Hierarchie beinhaltet, aber es scheint mir sauberer zu sein.
Ich habe es bereits versucht und es funktioniert gut.
quelle
Versuchen Sie es damit:
Stil:
Hauptaktivität erweitert ActionBarActivity
Jetzt können Sie
onCreateOptionsMenu
wie gewohnt ActionBar mit ToolBar mögen.Das ist mein Layout
Hoffe du verstehst! Viel Spaß!
quelle