主要是控件的使用:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!--这里是主界面,content,该写什么写什么,加载的时候界面上只会显示这里面的内容-->
</LinearLayout>
<LinearLayout
android:id="@+id/drawer_1"
android:layout_width="280dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical"
android:background="#003671">
<!--这里是左边抽屉,加载的时候不会显示,要通过手势侧边滑动或者代码控制才会显示-->
<!--侧边栏的大小由宽度layout_width控制-->
</LinearLayout>
<LinearLayout
android:id="@+id/drawer_2"
android:layout_width="120dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:gravity="center"
android:orientation="vertical"
android:textSize="30sp" >
<!--这里是右边抽屉,同样加载的时候不会显示,要通过手势侧边滑动或者代码控制才会显示-->
<!--侧边栏的大小由宽度layout_width控制-->
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
OK,搞定。可以去加载它来用了,直接手势侧边滑动可用,需要说明的是侧边栏背景不设置就是透明背景,不过整体会变灰暗,侧边栏内容字体是白色的话还挺酷炫的。
是不是漏了什么?对的,还可以通过代码控制打开和关闭,
//先要通过findViewById获得这个侧边栏控件mDrawerLayout,然后可以通过事件监听打开和关闭抽屉
//打开抽屉
mDrawerLayout.openDrawer(Gravity.LEFT);//同理,打开右边就是Gravity.RIGHT
//关闭抽屉
mDrawerLayout.closeDrawers();//关闭所有,其实两边也不会同时出来,所以关闭所有即可关闭任意一边
//当然你也可以严谨一点,非要关闭一边
//closeDrawer(Gravity.LEFT);//or Gravity.RIGHT
以及屏蔽手势:
//屏蔽手势操作,解锁参数DrawerLayout.LOCK_MODE_UNLOCKED
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
//如果只想屏蔽其中一边:
//mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,Gravity.LEFT);//或者Gravity.RIGHT
遇到的问题:
点击DrawerLayout的布局,会触发被滑出页面挡住的布局中的点击事件:
解决方案:在DrawerLayout的最外层布局中,设置android:clickable=”true”
拓展:(转)全屏手势滑出。不过这个方法本人亲测有两个小bug:
1、跟另一侧出来后的滑回有冲突;
2、长按不滑动也会出来,和其他滑动操作冲突。
/**
* 重新设置DrawerLayout控件侧滑距离
* @param activity
* @param drawerLayout
* @param displayWidthPercentage 传1表示全屏滑动
*/
private void setDrawerLeftEdgeSize (Activity activity, DrawerLayout drawerLayout, float displayWidthPercentage,boolean isSetLeft) {
if (activity == null || drawerLayout == null)
return;
try {
// 找到 ViewDragHelper 并设置 Accessible 为true
Field leftDraggerField =
drawerLayout.getClass().getDeclaredField(isSetLeft?"mLeftDragger":"mRightDragger");
leftDraggerField.setAccessible(true);
ViewDragHelper leftDragger = (ViewDragHelper) leftDraggerField.get(drawerLayout);
// 找到 edgeSizeField 并设置 Accessible 为true
Field edgeSizeField = leftDragger.getClass().getDeclaredField("mEdgeSize");
edgeSizeField.setAccessible(true);
int edgeSize = edgeSizeField.getInt(leftDragger);
// 设置新的边缘大小
Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(displaySize);
edgeSizeField.setInt(leftDragger, Math.max(edgeSize, (int) (displaySize.x *
displayWidthPercentage)));
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}