it-swarm.com.de

Android Navigationsleiste oben in der ActionBar

Ich versuche, die Navigationsleiste über die Aktionsleiste zu ziehen, als sie wie in der folgenden App nach rechts verschoben wurde: [Entfernt]

Das ist das Layout meiner Hauptaktivität:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout ...>
    <RelativeLayout Android:orientation="vertical" 
        Android:layout_width="fill_parent" 
        Android:layout_height="fill_parent">
        ...
    </RelativeLayout>
    <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>

Einige andere Fragen zum Stackoverflow sind ähnlich wie diese Frage , es wird jedoch empfohlen, in allen Antworten das Schiebemenü lib zu verwenden. Aber diese App verwenden sie immer noch Android.support.v4.widget.DrawerLayout und sie sind erfolgreich. Fragen Sie mich nicht, woher ich weiß, dass sie die Standardnavigationsschublade verwenden, aber ich bin mir sicher.

Wäre echt dankbar für eure Hilfe.


HIER IS THE FINAL SOLUTION : Vielen Dank an @ Peter Cai DAS FUNKTIONIERT PERFEKT https://github.com/lemycanh/DrawerOnTopActionBar

Screen CaptureTranslucent on KitKat

51
lemycanh

Ich habe einen winzigen "Trick" gelernt von https://github.com/jfeinstein10/SlidingMen , um den gewünschten Effekt zu implementieren.

Sie müssen nur das erste untergeordnete Element der Dekoransicht des Fensters entfernen und das erste untergeordnete Element zur Inhaltsansicht Ihrer Schublade hinzufügen. Danach müssen Sie nur noch Ihre Schublade zur Dekoransicht des Fensters hinzufügen.

Nachfolgend finden Sie einige detaillierte Schritte, damit Sie dies tun können.

Erstellen Sie zunächst eine XML-Datei mit dem Namen "decor.xml" oder eine beliebige andere Datei. Legen Sie nur das DrawerLayout und die Schublade ein. Das "FrameLayout" unten 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 sollte das Layout Ihrer Hauptaktivität so aussehen

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

wir gehen davon aus, dass das Layout der Hauptaktivität "main.xml" heißt.

schreiben Sie in Ihre Hauptaktivität wie folgt:

@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 haben Sie ein DrawerLayout, das über die ActionBar gleiten kann. Möglicherweise wird es jedoch von der Statusleiste verdeckt. Möglicherweise müssen Sie der Schublade ein paddingTop hinzufügen, um dies zu beheben.

50
Peter Cai

UPDATE: Wie die Aktionsleiste mit der Navigationsleiste überlagert wird. (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 ist Ihr Schubladenlayout

<!-- 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>

Erstellen Sie eine neue toolbar.xml-Datei in Ihrem Layoutordner.

<?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 Sie zu Ihrer Aktivität, die die Navigationsleiste erweitert. und füge dies nach SetContentView () hinzu

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

Vergessen Sie nicht, Ihr Thema NoActionBar in Ihrem Werteverzeichnis 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>
34

Wenn Sie keine lib oder diesen Hack verwenden möchten:

  1. "Theme.AppCompat.NoActionBar" erweitern
  2. Verschieben Sie das erste Element Ihres DrawerLayouts in ein LinearLayout.
  3. Fügen Sie diesem LinearLayout eine Symbolleiste 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. fügen Sie in Aktivität nach setContentView die folgende Zeile hinzu

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

Ich habe einen Trick gepostet, der dies in früheren Android L-Versionen möglich macht. Sie können meine Lösung finden in diesem Beitrag . Ich hoffe, es kann jemandem nützlich sein.

0
Andranik