Join the social network of Tech Nerds, increase skill rank, get work, manage projects...
 
  • How to make Full Screen Navigation Drawer layout in android?

    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    • 2
    • 0
    • 8.45k
    Comment on it

    In the below example code I have created Full-screen Navigation Drawer layout with the help of FullDrawerLayout class.


      Step(1)-activity_main.xml -Here I have added package name with FullDrawerLayout class name
     

     <?xml version="1.0" encoding="utf-8"?>
    
    <com.tiwari.rajshekhar.navdrwerfull.FullDrawerLayout    //*Added package name with FullDrawerLayout class *//
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:fitsSystemWindows="true"
        android:layout_height="match_parent">
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <android.support.v7.widget.Toolbar
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?android:attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:id="@+id/toolBar"
            android:theme="@style/ThemeOverlay.AppCompat.Dark"/>
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ee201f1f"
            android:id="@+id/containerView">
        </FrameLayout>
     </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:orientation="vertical"
            >
            <include layout="@layout/header" />
            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/recyclerView"
                android:scrollbars="vertical"
                android:background="#FFFFFF"
                />
        </LinearLayout>
    
        </com.tiwari.rajshekhar.navdrwerfull.FullDrawerLayout>
    
    


    Step(2)-Created a FullDrawerLayout class- Here I have extended DrawerLayout and override some methods because MIN_DRAWER_MARGIN is private. And I have used onMeasure() method by to set layout_width and height, on this method I have used EXACTLY constraint to set the size exactly to the parent view.

        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);
        }
    
    }

     

    Output-

    How to make Full Screen Navigation Drawer layout in android?

 0 Comment(s)

Sign In
                           OR                           
                           OR                           
Register

Sign up using

                           OR                           
Forgot Password
Fill out the form below and instructions to reset your password will be emailed to you:
Reset Password
Fill out the form below and reset your password: