2014-04-25 34 views
51

Ich versuche, die Navigationsleiste über die Aktionsleiste zu machen, wenn es nach rechts schieben, wie diese App ist: [removed]Android Navigationsleiste oben ActionBar

Das ist meine Haupttätigkeit des Layout:

Einige andere Fragen zu Stackoverflow sind ähnlich wie this question aber alle Antworten werden empfohlen, gleitende Menübibliothek zu verwenden. Aber diese App verwenden sie noch android.support.v4.widget.DrawerLayout und sie sind erfolgreich. Frag mich nicht, wie ich weiß, dass sie die Standard-Navigationsschublade verwenden, aber ich bin mir sicher.

Wäre wirklich dankbar für Ihre Hilfe.


HIER IST DIE ENDLÖSUNG: vielen Dank an @ Peter Cai THIS perfekt funktioniert. https://github.com/lemycanh/DrawerOnTopActionBar

Screen CaptureTranslucent on KitKat

Antwort

49

Ich habe einen kleinen "Trick" aus https://github.com/jfeinstein10/SlidingMenu gelernt, um den gewünschten Effekt zu implementieren.

Sie müssen nur das erste Kind der Dekoransicht des Fensters entfernen und das erste Kind in die Inhaltsansicht Ihrer Schublade einfügen. Danach müssen Sie Ihre Schublade nur zur Dekoransicht des Fensters hinzufügen.

Unten finden Sie einige detaillierte Schritte für Sie.

Erstellen Sie zuerst eine XML-Datei namens "decor.xml" oder etwas, das Sie mögen. Lege nur das DrawerLayout und die Schublade hinein. Das "FrameLayout" darunter ist nur ein Container. Wir werden es verwenden, um den Inhalt Ihrer Aktivität zu verpacken.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout ...> 
    <FrameLayout android:id="@+id/container" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    <fragment android:name="com...." 
     android:layout_gravity="start" 
     android:id="@id/navigation" 
     android:layout_width="@dimen/navigation_menu_width" 
     android:layout_height="fill_parent" /> 
</android.support.v4.widget.DrawerLayout> 

und entfernen Sie dann das DrawerLayout in Ihrem Hauptlayout.Nun ist das Layout Ihrer Haupttätigkeit soll wie folgt aussehen

<RelativeLayout android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    ... 
</RelativeLayout> 

wir davon ausgehen, dass die Layout der Hauptaktivität „main.xml“ genannt.

in Ihrem MainActivity, schreiben, wie folgt zusammen:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Inflate the "decor.xml" 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.decor, null); // "null" is important. 

    // HACK: "steal" the first child of decor view 
    ViewGroup decor = (ViewGroup) getWindow().getDecorView(); 
    View child = decor.getChildAt(0); 
    decor.removeView(child); 
    FrameLayout container = (FrameLayout) drawer.findViewById(R.id.container); // This is the container we defined just now. 
    container.addView(child); 

    // Make the drawer replace the first child 
    decor.addView(drawer); 

    // Do what you want to do....... 

} 

Jetzt hast du ein DrawerLayout, die über die ActionBar gleiten kann. Aber Sie könnten es durch die Statusleiste abgedeckt finden. Möglicherweise müssen Sie der Schublade ein paddingTop hinzufügen, um dies zu beheben.

+3

Bestätigt, dass dieser Hack wie erwartet funktioniert. Wir müssen Padding zu Schublade hinzufügen, hier ist der Trick, Statusleiste Höhe zu bekommen: http://StackOverflow.com/Questions/ 20584325/zuverlässig-erhalten-Höhe-Status-bar-zu-lösen-kitkat-translucent-Navigation-Problem. Ein weiterer Hack ist, wenn wir Fragment zu Container hinzufügen möchten, anstatt wie folgt hinzufügen: FragmentTransaction.replace (R .id.contai ner, Fragment); Wir sollten zu R.id.content ersetzen. fragmentTransaction.replace (getContentIdResource(), Fragment); ... private int getContentIdResource() { \t \t Rückgabe getResources(). GetIdentifier ("Inhalt", "ID", "Android"); \t} – lemycanh

+0

@lemycanh Eine andere Lösung, die ich zum Hinzufügen von Fragment verwenden, ist das Hinzufügen eines Containers im Hauptlayout. Das Schubladenlayout wurde vom Hauptlayout getrennt. Daher muss R.id.container nur das in main.xml definierte Layout umbrechen. –

+0

große Antwort! Nach der Implementierung erkannte ich, dass wir tatsächlich einen Blick von einem anderen Layout stehlen und es wegwerfen! ha ha – uLYsseus

34

UPDATE: Wie die ActionBar mit nav Schublade zu überlagern. (Mit der neuen Toolbar) Verwenden Sie diese in Ihren Abhängigkeiten in Ihrem build.gradle

compile 'com.android.support:appcompat-v7:21.0.0' 
compile 'com.android.support:support-v4:21.0.0' 

Dies als drawerlayout

<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. --> 
<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:id="@+id/layout_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
    <include layout="@layout/toolbar"/> 
    <!-- As the main content view, the view below consumes the entire 
     space available using match_parent in both dimensions. --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/white"/> 

    </LinearLayout> 
    <fragment android:id="@+id/navigation_drawer" 
     android:layout_width="@dimen/navigation_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@color/list_background" 
     /> 

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

neue toolbar.xml Datei in Ihrem Layout-Ordner.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" /> 

Gehen zu Ihnen Aktivität, die die Navigationsschublade erweitern. und fügen Sie diese nach SetContentView()

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

Vergessen Sie nicht, Ihr Thema NoActionBar in Ihren Werten Ordner zu erweitern.

<style name="Theme.Whtsnxt" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <!-- colorPrimary is used for the default action bar background --> 
    <item name="windowActionModeOverlay">true</item> 
    <item name="android:textColorPrimary">@color/white</item> 
    <item name="colorPrimary">@color/splashscreen</item> 
    <item name="colorPrimaryDark">@color/holo_blue_light</item> 

    <item name="android:windowBackground">@color/white</item> 
    <item name="android:colorBackground">@color/white</item> 

</style> 
+0

Sie können apktool verwenden, um das Layout zu sehen. Es ist schlecht, aber ich habe keinen Weg :( – lemycanh

+1

Diese Bibliothek sollte nicht verwendet werden. Es wurde für eine sehr lange Zeit nicht aktualisiert, und es widerspricht den Designrichtlinien, wenn Google das DrawerLayout hat. Sehen Sie sich die Google I/O an App, speziell die Material-Version für Android L (es ist auf der GitHub-Seite: https://github.com/google/iosched). Die DrawerLayout kann die Aktionsleiste abdecken. – afollestad

+0

Zum Zeitpunkt der Antwort gab es keine Lösungen wie This I Know! Danke für Ihren Vorschlag Ich habe die Antwort bearbeitet! –

0

Ich habe einen Trick gepostet, der dies in früheren Android L-Versionen ermöglicht. Sie können meine Lösung in this post finden. Hoffe, dass es für jemanden nützlich sein kann.

0

Wenn Sie nicht wollen, eine lib oder diesen Hack verwenden:

  1. Extend "Theme.AppCompat.NoActionBar"
  2. Bewegen Sie den ersten Teil Ihrer DrawerLayout in eine Linearlayout.
  3. Fügen Sie diesem LinearLayout eine Werkzeugleiste hinzu.

    <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:minHeight="?attr/actionBarSize" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        app:titleTextColor="@android:color/white" 
        android:background="?attr/colorPrimary"> 
    </android.support.v7.widget.Toolbar> 
    
  4. in Aktivität hinzufügen folgende Zeile nach setContentView

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); 
    
  5. jetzt sollte es funktionieren.
+0

sah jetzt, dass [hier] (https://stackoverflow.com/a/30998517/2347168) die gleiche Antwort ist, aber mit mehr Code. – fupduck