Android设置导航抽屉列表打开所有设备屏幕的确切一半的屏幕

我想打开抽屉到所有不同设备的屏幕的一半。 我试图layout_margineleft 200dp或100dp的硬编码值到抽屉。 但它不适用于所有设备,因为它不同于设备。 所以我怎么能维护抽屉的屏幕的一半。 我也尝试了像setLeft(int)等各种function,但其中一些不起作用,因为我使用最低版本8.所以请帮助我。 提前致谢。

mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout); mDrawerList = (ListView) view.findViewById(R.id.top_sectionlist); 

xml为:

 <?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" android:background="@color/setting_background" > <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_margin="@dimen/top_news_linear_margin" android:background="@color/news_list_divider_color" android:orientation="vertical" android:padding="@dimen/top_news_linear_padding" > </RelativeLayout> <ListView android:id="@+id/drawer_list" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_alignParentTop="true" android:background="@color/setting_background" android:cacheColorHint="@android:color/transparent" android:choiceMode="singleChoice" android:divider="@color/news_list_divider_color" android:dividerHeight="@dimen/news_list_divider_height" /> </android.support.v4.widget.DrawerLayout> 

Solutions Collecting From Web of "Android设置导航抽屉列表打开所有设备屏幕的确切一半的屏幕"

dynamic设置ListView的宽度…

  mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout); mDrawerList = (ListView) view.findViewById(R.id.top_sectionlist); int width = getResources().getDisplayMetrics().widthPixels/2; DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) mDrawerList.getLayoutParams(); params.width = width; mDrawerList.setLayoutParams(params); 

您必须手动计算屏幕大小并在运行时为抽屉布局设置dynamic宽度,以下是在运行时如何获取设备的屏幕宽度和高度

使用这个代码,你可以得到运行时显示的宽度和高度

 DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels; 

现在,你需要把宽度除以2

 int newWidth=width/2; 

现在将宽度设置为像这样的ListView

 drawer_list.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,newWidth)); 

这将适用于所有设备,并将统一大小。

使用新的Android支持devise库,您可以使用android.support.percent.PercentRelativeLayout轻松完成此任务。 这是我的解决scheme。

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" 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:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="-64dp" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="64dp"/> <android.support.percent.PercentRelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" > <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="0dp" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:fitsSystemWindows="true" app:layout_widthPercent="50%" app:headerLayout="@layout/nav_header_dashboard" app:menu="@menu/menu_drawer_activity_dashboard"/> </android.support.percent.PercentRelativeLayout> </android.support.v4.widget.DrawerLayout> 

如果你问为什么在DrawerLayout和内容中有一个android:layout_marginRight="-64dp"android:layout_marginRight="-64dp" 。 这是因为DrawerLayout的固定边距是直接编码到DrawerLayout ,所以不允许你使用抽屉的全部宽度。 更多关于这里

这里是我的解决scheme,其他谁需要几个百分比来显示导航抽屉。

在这里,我使用右侧导航抽屉,当抽屉向左移动时,我会显示主屏幕的15%。

  // convert your offset percent (here 15% ) into decimal by dividing 100 float offset = .15f * getResources().getDisplayMetrics().widthPixels ; float width = getResources().getDisplayMetrics().widthPixels - offset; DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) rightNavigationView.getLayoutParams(); params.width = (int) width; rightNavigationView.setLayoutParams(params); 
  int currentVerion = Build.VERSION.SDK_INT; int width= 0; Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); if(currentVerion >= Build.VERSION_CODES.BASE) { display.getSize(size); width = size.x; } else { width = display.getWidth(); } ((ListView) view.findViewById(R.id.top_sectionlist)).getLayoutParams().width =width/2;