web-dev-qa-db-de.com

Wie verwende ich DrawerLayout, um über der Aktionsleiste / Symbolleiste und unter der Statusleiste anzuzeigen?

Ich habe im neuen Materialdesign der Side Nav-Spezifikation gesehen, dass Sie die Schublade über der Aktionsleiste und hinter der Statusleiste anzeigen können. Wie kann ich das umsetzen?

389
Chris Banes

Neue Funktionen in den Framework- und Support-Bibliotheken ermöglichen genau dies. Es gibt drei Puzzleteile:

  1. Verwenden Sie Symbolleiste , um die Aktionsleiste in Ihre Ansichtshierarchie einzubetten.
  2. Erstellen Sie DrawerLayoutfitsSystemWindows, sodass es hinter den Systemleisten angeordnet ist.
  3. Deaktivieren Sie die normale Statusleistenfarbe von Theme.Material, damit DrawerLayout stattdessen dort zeichnen kann.

Ich gehe davon aus, dass Sie den neuen appcompat verwenden werden.

Zunächst sollte Ihr Layout so aussehen:

<!-- The important thing to note here is the added fitSystemWindows -->
<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/my_drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true">

    <!-- Your normal content view -->
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

        <!-- We use a Toolbar so that our drawer can be displayed
             in front of the action bar -->
        <Android.support.v7.widget.Toolbar  
            Android:id="@+id/my_awesome_toolbar"
            Android:layout_height="wrap_content"
            Android:layout_width="match_parent"
            Android:minHeight="?attr/actionBarSize"
            Android:background="?attr/colorPrimary" />

        <!-- The rest of your content view -->

    </LinearLayout>

    <!-- Your drawer view. This can be any view, LinearLayout
         is just an example. As we have set fitSystemWindows=true
         this will be displayed under the status bar. -->
    <LinearLayout
        Android:layout_width="304dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="left|start"
        Android:fitsSystemWindows="true">

        <!-- Your drawer content -->

    </LinearLayout>

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

Dann in Ihrer Aktivität/Fragment:

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

    // Your normal setup. Blah blah ...

    // As we're using a Toolbar, we should retrieve it and set it
    // to be our ActionBar
    Toolbar toolbar = (...) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    // Now retrieve the DrawerLayout so that we can set the status bar color.
    // This only takes effect on Lollipop, or when using translucentStatusBar
    // on KitKat.
    DrawerLayout drawerLayout = (...) findViewById(R.id.my_drawer_layout);
    drawerLayout.setStatusBarBackgroundColor(yourChosenColor);
}

Dann müssen Sie sicherstellen, dass das DrawerLayout hinter der Statusleiste sichtbar ist. Sie tun dies, indem Sie Ihr values-v21-Thema ändern:

values-v21/themes.xml

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

Hinweis: Wenn ein <fragment Android:name="fragments.NavigationDrawerFragment"> anstelle von verwendet wird

<LinearLayout
    Android:layout_width="304dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="left|start"
    Android:fitsSystemWindows="true">

    <!-- Your drawer content -->

</LinearLayout>

für das tatsächliche Layout wird der gewünschte Effekt erzielt, wenn Sie fitsSystemWindows(boolean) für eine Ansicht aufrufen, die Sie von der onCreateView -Methode zurückgeben.

@Override
public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View mDrawerListView = inflater.inflate(
        R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView.setFitsSystemWindows(true);
    return mDrawerListView;
}
523
Chris Banes

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 sample 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.

/*
* Copyright 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.Apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* A layout that draws something in the insets passed to 
* {@link #fitSystemWindows(Rect)}, i.e. the area above UI chrome
* (status and navigation bars, overlay action bars).
*/
public class ScrimInsetsFrameLayout extends FrameLayout {
    private Drawable mInsetForeground;

    private Rect mInsets;
    private Rect mTempRect = new Rect();
    private OnInsetsCallback mOnInsetsCallback;

    public ScrimInsetsFrameLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public ScrimInsetsFrameLayout(
        Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        final TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.ScrimInsetsView, defStyle, 0);
        if (a == null) {
            return;
        }
        mInsetForeground = a.getDrawable(
            R.styleable.ScrimInsetsView_insetForeground);
        a.recycle();

        setWillNotDraw(true);
    }

    @Override
    protected boolean fitSystemWindows(Rect insets) {
        mInsets = new Rect(insets);
        setWillNotDraw(mInsetForeground == null);
        ViewCompat.postInvalidateOnAnimation(this);
        if (mOnInsetsCallback != null) {
            mOnInsetsCallback.onInsetsChanged(insets);
        }
        return true; // consume insets
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);

        int width = getWidth();
        int height = getHeight();
        if (mInsets != null && mInsetForeground != null) {
            int sc = canvas.save();
            canvas.translate(getScrollX(), getScrollY());

            // Top
            mTempRect.set(0, 0, width, mInsets.top);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Bottom
            mTempRect.set(0, height - mInsets.bottom, width, height);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Left
            mTempRect.set(
                0, 
                mInsets.top, 
                mInsets.left, 
                height - mInsets.bottom);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Right
            mTempRect.set(
                width - mInsets.right, 
                mInsets.top, width, 
                height - mInsets.bottom);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            canvas.restoreToCount(sc);
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mInsetForeground != null) {
            mInsetForeground.setCallback(this);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mInsetForeground != null) {
            mInsetForeground.setCallback(null);
        }
    }

    /**
     * Allows the calling container to specify a callback for custom 
     * processing when insets change (i.e. when {@link #fitSystemWindows(Rect)}
     * is called. This is useful for setting padding on UI elements 
     * based on UI chrome insets (e.g. a Google Map or a ListView). 
     * When using with ListView or GridView, remember to set
     * clipToPadding to false.
     */
    public void setOnInsetsCallback(OnInsetsCallback onInsetsCallback) {
        mOnInsetsCallback = onInsetsCallback;
    }

    public static interface OnInsetsCallback {
        public void onInsetsChanged(Rect insets);
    }
}

Erstellen Sie dann eine Stilvorlage, damit insetForeground festgelegt werden kann.

values ​​/ attrs.xml

<declare-styleable name="ScrimInsetsView">
    <attr name="insetForeground" format="reference|color" />
</declare-styleable>

Aktualisieren Sie die XML-Datei Ihrer Aktivität und stellen Sie sicher, dass Android:fitsSystemWindows sowohl für DrawerLayout als auch für ScrimInsetsFrameLayout auf true gesetzt ist.

layout/activity_main.xml

<Android.support.v4.widget.DrawerLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/drawerLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <!-- The main content view -->
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

        <!-- Your main content -->

    </LinearLayout>

    <!-- The navigation drawer -->
    <com.example.app.util.ScrimInsetsFrameLayout 
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/scrimInsetsFrameLayout"
        Android:layout_width="320dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="@color/white"
        Android:elevation="10dp"
        Android:fitsSystemWindows="true"
        app:insetForeground="#4000">

        <!-- Your drawer content -->

    </com.example.app.util.ScrimInsetsFrameLayout>

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

Legen Sie innerhalb der onCreate-Methode Ihrer Aktivität die Hintergrundfarbe der Statusleiste im Schubladenlayout fest.

MainActivity.Java

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

    // ...

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    mDrawerLayout.setStatusBarBackgroundColor(
        getResources().getColor(R.color.primary_dark));
}

Aktualisieren Sie schließlich das Thema Ihrer App, sodass sich DrawerLayout hinter der Statusleiste befindet.

values-v21/styles.xml

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

Ergebnis:

136
Suyash

Mit der Veröffentlichung der neuesten Android Support Library (rev 22.2.0) haben wir eine Design Support Library und als Teil davon eine neue Ansicht namens NavigationView . Anstatt also alles alleine mit dem ScrimInsetsFrameLayout und all den anderen Dingen zu machen, verwenden wir einfach diese Ansicht und alles wird für uns getan.

Beispiel

Schritt 1

Fügen Sie den Design Support Library zu Ihrer build.gradle -Datei hinzu

dependencies {
    // Other dependencies like appcompat
    compile 'com.Android.support:design:22.2.0'
}

Schritt 2

Fügen Sie das NavigationView zu Ihrem DrawerLayout hinzu:

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
     xmlns:app="http://schemas.Android.com/apk/res-auto"
     Android:id="@+id/drawer_layout"
     Android:layout_width="match_parent"
     Android:layout_height="match_parent"
     Android:fitsSystemWindows="true"> <!-- this is important -->

     <!-- Your contents -->

     <Android.support.design.widget.NavigationView
         Android:id="@+id/navigation"
         Android:layout_width="wrap_content"
         Android:layout_height="match_parent"
         Android:layout_gravity="start"
         app:menu="@menu/navigation_items" /> <!-- The items to display -->
 </Android.support.v4.widget.DrawerLayout>

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:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <group Android:checkableBehavior="single">
        <item
            Android:id="@+id/nav_home"
            Android:icon="@drawable/ic_action_home"
            Android:title="Home" />
        <item
            Android:id="@+id/nav_example_item_1"
            Android:icon="@drawable/ic_action_dashboard"
            Android:title="Example Item #1" />
    </group>

    <item Android:title="Sub items">
        <menu>
            <item
                Android:id="@+id/nav_example_sub_item_1"
                Android:title="Example Sub Item #1" />
        </menu>
    </item>

</menu>

Schritt 4

Starten Sie die Navigationsansicht und behandeln Sie Klickereignisse:

public class MainActivity extends AppCompatActivity {

    NavigationView mNavigationView;
    DrawerLayout mDrawerLayout;

    // Other stuff

    private void init() {
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mDrawerLayout.closeDrawers();
                menuItem.setChecked(true);
                switch (menuItem.getItemId()) {
                    case R.id.nav_home:
                        // TODO - Do something
                        break;
                    // TODO - Handle other items
                }
                return true;
            }
        });
    }
}

Schritt 5

Stellen Sie sicher, dass Android:windowDrawsSystemBarBackgrounds und Android:statusBarColor in values-v21 eingestellt sind, sonst wird Ihre Schublade nicht "unter" der Statusleiste angezeigt

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Other attributes like colorPrimary, colorAccent etc. -->
    <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="Android:statusBarColor">@Android:color/transparent</item>
</style>

Optionaler Schritt

Fügen Sie der Navigationsansicht eine Kopfzeile hinzu. Erstellen Sie dazu einfach ein neues Layout und fügen Sie der Navigationsansicht app:headerLayout="@layout/my_header_layout" hinzu.

Ergebnis

picture showing navigation view

Anmerkungen

  • Die hervorgehobene Farbe verwendet die Farbe, die über das Attribut colorPrimary definiert wurde
  • Die Listenelemente verwenden die Farbe , die über textColorPrimary definiert wurde. Attribut
  • Die Symbole verwenden die Farbe , die über das Attribut textColorSecondary definiert wurde

Sie können auch die Beispielanwendung von Chris Banes überprüfen, die die Navigationsansicht zusammen mit den anderen neuen Ansichten hervorhebt, die Teil der Design Support Library sind (wie die FloatingActionButton , TextInputLayout , Snackbar , TabLayout usw.)

94
reVerse

Die oben genannten Ansätze sind korrekt und funktionieren möglicherweise. Ich habe eine funktionierende Demo erstellt, die der obigen Anleitung folgt und auf 2.x bis 5.x getestet wurde

Du kannst von Github klonen

Das Wichtigste zum Herumspielen ist die Hauptaktivität

toolbar = (Toolbar) findViewById(R.id.toolbar);
res = this.getResources();

this.setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { 
    ScrimInsetsFrameLayout scrimInsetsFrameLayout = (ScrimInsetsFrameLayout)
            findViewById(R.id.linearLayout);
    scrimInsetsFrameLayout.setOnInsetsCallback(this);
} 

und der Rückruf

@Override
public void onInsetsChanged(Rect insets) {
    Toolbar toolbar = this.toolbar;
    ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)
        toolbar.getLayoutParams();
    lp.topMargin = insets.top;
    int top = insets.top;
    insets.top += toolbar.getHeight();
    toolbar.setLayoutParams(lp);
    insets.top = top; // revert
}

Absolut das Theme für V21 macht die Magie

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- API 21 theme customizations can go here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/accent_material_light</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="Android:statusBarColor">@Android:color/transparent</item>
    <item name="Android:windowTranslucentStatus">true</item>
</style>

und das ScrimInsetsFrameLayout

Mit der neuen Design Support-Bibliothek wird dies jetzt noch einfacher

compile 'com.Android.support:design:22.2.0'

klon von @Chris Banes https://github.com/chrisbanes/cheesesquare

6
Vipin Sahu

Damit es funktioniert, muss xml in den Formaten values-v21 oder theme dieses Attribut verwenden:

<item name="Android:windowTranslucentStatus">true</item>

Das macht die Magie!

6
Nicolas Jafelle

Alle hier genannten Antworten sind zu alt und zu lang. Die beste und kürzeste Lösung, die mit der neuesten Navigationsansicht funktioniert, ist

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
    super.onDrawerSlide(drawerView, slideOffset);

    try {
        //int currentapiVersion = Android.os.Build.VERSION.SDK_INT;
        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop){
            // Do something for Lollipop and above versions

        Window window = getWindow();

        // clear FLAG_TRANSLUCENT_STATUS flag:
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

        // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

        // finally change the color to any color with transparency

         window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDarktrans));}

    } catch (Exception e) {

        Crashlytics.logException(e);

    }
}

dadurch ändert sich die Farbe der Statusleiste in transparent, wenn Sie die Schublade öffnen

Wenn Sie nun die Schublade schließen, müssen Sie die Farbe der Statusleiste wieder auf dunkel ändern. So können Sie dies tun.

        public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);
        try {
    if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop){
    // Do something for Lollipop and above versions

    Window window = getWindow();

    // clear FLAG_TRANSLUCENT_STATUS flag:
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

    // finally change the color again to dark
    window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));}
    } catch (Exception e) {
    Crashlytics.logException(e);
                    }
                    }

und fügen Sie dann im Hauptlayout eine einzelne Zeile hinzu, d.h.

            Android:fitsSystemWindows="true"

und Ihr Schubladenlayout wird so aussehen

            <Android.support.v4.widget.DrawerLayout     
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:app="http://schemas.Android.com/apk/res-auto"
            xmlns:tools="http://schemas.Android.com/tools"
            Android:id="@+id/drawer_layout"
            Android:fitsSystemWindows="true"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">

und Ihre Navigationsansicht wird so aussehen

    <Android.support.design.widget.NavigationView
        Android:id="@+id/navigation_view"
        Android:layout_height="match_parent"
        Android:layout_width="wrap_content"
        Android:layout_gravity="start"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/navigation_header"
        app:menu="@menu/drawer"
        />

Ich habe es getestet und es funktioniert voll. Ich hoffe, es hilft jemandem. Dies mag nicht der beste Ansatz sein, aber es funktioniert reibungslos und ist einfach zu implementieren. Markieren Sie es, wenn es hilft.Glückliche Codierung :)

4
Harry Sharma

Ich verwende die Design Support Library. Und nur durch die Verwendung eines benutzerdefinierten Themas habe ich beim Öffnen der Navigationsleiste eine transparente Statusleiste erhalten.

enter image description here

enter image description here

<style name="NavigationStyle" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/primaryColor</item>
    <item name="colorPrimaryDark">@color/primaryColorDark</item>

    <!-- To Make Navigation Drawer Fill Status Bar and become Transparent Too -->
    <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="Android:statusBarColor">@Android:color/transparent</item>

</style>

Zum Schluss das Thema in die Manifest-Datei einfügen

<activity
  ........
  ........
 Android:theme="@style/NavigationStyle"> 
</activity>

Vergessen Sie nicht, die Eigenschaft Android:fitsSystemWindows="true" in "DrawerLayout" zu verwenden

3
katwal-Dipak

Dies ist die einfachste und hat bei mir funktioniert:

In den Werten-21:

<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        ...
        <item name="Android:windowTranslucentStatus">true</item>
    </style>
    <dimen name="topMargin">25dp</dimen>
</resources>

In den Werten:

<resources>
    <dimen name="topMargin">0dp</dimen>
</resources>

Und setzen Sie auf Ihre Symbolleiste

Android:layout_marginTop="@dimen/topMargin"
2
Nicolás López

Anstelle von ScrimInsetsFrameLayout ... ist es nicht einfacher, eine Ansicht mit einer festen Höhe von 24dp und einem Hintergrund von primaryColor hinzuzufügen?

Ich verstehe, dass dies das Hinzufügen einer Dummy-Ansicht in die Hierarchie beinhaltet, aber es scheint mir sauberer zu sein.

Ich habe es bereits ausprobiert und es funktioniert gut.

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/activity_base_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">

        <!-- THIS IS THE VIEW I'M TALKING ABOUT... -->
        <View
            Android:layout_width="match_parent"
            Android:layout_height="24dp"
            Android:background="?attr/colorPrimary" />

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/activity_base_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="?attr/colorPrimary"
            Android:elevation="2dp"
            Android:theme="@style/ThemeOverlay.AppCompat.Dark" />

        <FrameLayout
            Android:id="@+id/activity_base_content_frame_layout"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" />

    </LinearLayout>

    <fragment
        Android:id="@+id/activity_base_drawer_fragment"
        Android:name="com.myapp.drawer.ui.DrawerFragment"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:elevation="4dp"
        tools:layout="@layout/fragment_drawer" />

</Android.support.v4.widget.DrawerLayout>
1
mato

Versuchen Sie es mit diesem:

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/drawer_layout"
Android:fitsSystemWindows="true">


<FrameLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <!--Main layout and ads-->
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

        <FrameLayout
            Android:id="@+id/ll_main_hero"
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="1">

        </FrameLayout>

        <FrameLayout
            Android:id="@+id/ll_ads"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">

            <View
                Android:layout_width="320dp"
                Android:layout_height="50dp"
                Android:layout_gravity="center"
                Android:background="#ff00ff" />
        </FrameLayout>


    </LinearLayout>

    <!--Toolbar-->
    <Android.support.v7.widget.Toolbar
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/toolbar"
        Android:elevation="4dp" />
</FrameLayout>


<!--left-->
<ListView
    Android:layout_width="240dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:choiceMode="singleChoice"
    Android:divider="@null"
    Android:background="@mipmap/layer_image"
    Android:id="@+id/left_drawer"></ListView>

<!--right-->
<FrameLayout
    Android:layout_width="240dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="right"
    Android:background="@mipmap/layer_image">

    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:src="@mipmap/ken2"
        Android:scaleType="centerCrop" />
</FrameLayout>

stil:

<style name="ts_theme_overlay" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/red_A700</item>
    <item name="colorPrimaryDark">@color/red1</item>
    <item name="Android:windowBackground">@color/blue_A400</item>
</style>

Hauptaktivität erweitert ActionBarActivity

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

Jetzt können Sie onCreateOptionsMenu wie normale ActionBar mit ToolBar.

Das ist mein Layout

  • OBEN: Linke Schublade - Rechte Schublade
    • MID: ToolBar (ActionBar)
    • UNTEN: ListFragment

Ich hoffe du verstehst! Viel Spaß!

0