Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Full width Navigation Drawer

I'd like to create a full width navigation drawer. Setting layout_width to match_parent on @+id/left_drawer yields in width of about 80% of screen space. This seems to be the standard behavior. Do I have to override onMeasure() of DrawerLayout?

My current code:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/drawer_layout"     android:layout_width="match_parent"     android:layout_height="match_parent">      <FrameLayout         android:layout_width="match_parent"         android:layout_height="match_parent"         android:background="@color/black"         android:id="@+id/mainFragmentContainer">     </FrameLayout>      <include         android:id="@+id/left_drawer"         android:orientation="vertical"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:layout_gravity="start"         layout="@layout/drawer"/> </android.support.v4.widget.DrawerLayout> 

Thanks.

like image 377
Martin Avatar asked May 25 '13 21:05

Martin


People also ask

How do I get my navigation drawer to open full screen?

So to make full drawer just give android:layout_marginStart="-64dp" to navigation view or the container where the drawer will be loaded. Save this answer.

What is a navigation drawer?

The navigation drawer is a UI panel that shows your app's main navigation menu. The drawer appears when the user touches the drawer icon in the app bar or when the user swipes a finger from the left edge of the screen.


2 Answers

If you want simpler solution you can just set negative margin

android:layout_marginLeft="-64dp" 

for your left_drawer:

<include         android:id="@+id/left_drawer"         android:orientation="vertical"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:layout_gravity="start"         layout="@layout/drawer"         android:layout_marginLeft="-64dp"/> 
like image 156
Robert Avatar answered Sep 28 '22 02:09

Robert


Yes, you have to extend DrawerLayout and override some methods because MIN_DRAWER_MARGIN is private

Here is a possible solution:

public class FullDrawerLayout extends DrawerLayout {      private static final int MIN_DRAWER_MARGIN = 0; // dp      public FullDrawerLayout(Context context) {         super(context);     }      public FullDrawerLayout(Context context, AttributeSet attrs) {         super(context, attrs);     }      public FullDrawerLayout(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);     }      @Override     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {         final int widthMode = MeasureSpec.getMode(widthMeasureSpec);         final int heightMode = MeasureSpec.getMode(heightMeasureSpec);         final int widthSize = MeasureSpec.getSize(widthMeasureSpec);         final int heightSize = MeasureSpec.getSize(heightMeasureSpec);          if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) {             throw new IllegalArgumentException(                     "DrawerLayout must be measured with MeasureSpec.EXACTLY.");         }          setMeasuredDimension(widthSize, heightSize);          // Gravity value for each drawer we've seen. Only one of each permitted.         int foundDrawers = 0;         final int childCount = getChildCount();         for (int i = 0; i < childCount; i++) {             final View child = getChildAt(i);              if (child.getVisibility() == GONE) {                 continue;             }              final LayoutParams lp = (LayoutParams) child.getLayoutParams();              if (isContentView(child)) {                 // Content views get measured at exactly the layout's size.                 final int contentWidthSpec = MeasureSpec.makeMeasureSpec(                         widthSize - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY);                 final int contentHeightSpec = MeasureSpec.makeMeasureSpec(                         heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY);                 child.measure(contentWidthSpec, contentHeightSpec);             } else if (isDrawerView(child)) {                 final int childGravity =                         getDrawerViewGravity(child) & Gravity.HORIZONTAL_GRAVITY_MASK;                 if ((foundDrawers & childGravity) != 0) {                     throw new IllegalStateException("Child drawer has absolute gravity " +                             gravityToString(childGravity) + " but this already has a " +                             "drawer view along that edge");                 }                 final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec,                         MIN_DRAWER_MARGIN + lp.leftMargin + lp.rightMargin,                         lp.width);                 final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec,                         lp.topMargin + lp.bottomMargin,                         lp.height);                 child.measure(drawerWidthSpec, drawerHeightSpec);             } else {                 throw new IllegalStateException("Child " + child + " at index " + i +                         " does not have a valid layout_gravity - must be Gravity.LEFT, " +                         "Gravity.RIGHT or Gravity.NO_GRAVITY");             }         }     }      boolean isContentView(View child) {         return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY;     }      boolean isDrawerView(View child) {         final int gravity = ((LayoutParams) child.getLayoutParams()).gravity;         final int absGravity = Gravity.getAbsoluteGravity(gravity,                 child.getLayoutDirection());         return (absGravity & (Gravity.LEFT | Gravity.RIGHT)) != 0;     }      int getDrawerViewGravity(View drawerView) {         final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;         return Gravity.getAbsoluteGravity(gravity, drawerView.getLayoutDirection());     }      static String gravityToString(int gravity) {         if ((gravity & Gravity.LEFT) == Gravity.LEFT) {             return "LEFT";         }         if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {             return "RIGHT";         }         return Integer.toHexString(gravity);     }  } 
like image 24
Nipper Avatar answered Sep 28 '22 00:09

Nipper