How to make fullscreen DrawerLayout in Android?

Essentially, I need the Options menu, which can be accessed by checking the screen from left to right (or by clicking the options button in the upper left corner of the screen). I also need it to close the screen, but not completely replace it (it must be translucent so that the previous menu is visible under it). What I have so far (I'm working on another's code, still haven't cleared everything, I'm sorry for the lack of information):

<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"> <!-- 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:layout_gravity="start" tells DrawerLayout to treat this as a sliding drawer on the left side for left-to-right languages and on the right side for right-to-left languages. The drawer is given a fixed width in dp and extends the full height of the container. A solid background is used for contrast with the content view. --> <ListView android:id="@+id/left_drawer" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="@color/blue" /> </android.support.v4.widget.DrawerLayout> 

I have some functions to populate the layout with interactive parameters, however I cannot make the parameters in full screen mode. I scroll left and right, and that's only about 75% of the way. How can I create a full-screen options bar? (I can not do this with a new action, it must overlap with the previous one)

I have transparency and option buttons, I just can not do it all the way to the right .: D

+6
source share
5 answers

This works in all versions of Android:

 View mSlidingView = findViewById(R.id.slider); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mSlidingView.getLayoutParams(); params.width = metrics.widthPixels; mSlidingView.setLayoutParams(params); 

Put this in your onCreate.

+7
source

The best way to do this is to create a custom DrawerLayout. I found this solution to work fine. Link to custom full-screen box layout implementation

 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 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); } } 
+2
source
 <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"/> 
+1
source
  FrameLayout frameLayout = findViewById(R.id.frame_menu); DrawerLayout.LayoutParams fparams = (DrawerLayout.LayoutParams) frameLayout.getLayoutParams(); DisplayMetrics displaymetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay() .getMetrics(displaymetrics); int w = displaymetrics.widthPixels; fparams.width = w; frameLayout.setLayoutParams(fparams); frameLayout.requestLayout(); 
0
source

It's too late to answer, but for future readings of this question I give my advice 2c: the view that contains the drawer should have the right and left margins set to -64dp because this value is explicitly set in the code for rendering the drawer.

So, in this case, and with android:layout_gravity="start" , the ListView should have two additional parameters, set as follows:

 <ListView ... android:layout_marginEnd="-65dp" android:layout_marginRight="-65dp" /> 

On the other hand, if android:layout_gravity="end" , then android:layout_marginStart and android:layout_marginLeft should be set to -65dp.

-1
source

Source: https://habr.com/ru/post/982232/


All Articles