本片是对DrawerLayout使用的一个详细解析,也是对开发中遇到问题的一些总结。
DrawerLayout是SupportLibrary中一个支持侧滑效果的控件,开发中主要是跟NavigationView+Toolbar配合来实现侧滑菜单,具体看效果。
这个效果模板即可实现,这里简单做下使用讲解,重点不在这里。
布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
//第一个ViewGroup是内容区域
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
//第一个ViewGroup是侧滑区域
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"/>
</android.support.v4.widget.DrawerLayout>
1:第一个ViewGroup是内容区域,必须放在第一位,后面的ViewGroup才是侧滑区域。
2: android:layout_gravity=”start” 表示侧滑方向,start是从左向右滑动,end是从右向左滑动。
3: app:headerLayout=”@layout/nav_header_main”自定义NavigationView头部布局
4: app:menu=”@menu/activity_main_drawer” 定义菜单item
activity_main_drawer:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera"
android:title="Import"/>
<item
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery"/>
<item
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow"/>
<item
android:id="@+id/nav_manage"
android:icon="@drawable/ic_menu_manage"
android:title="Tools"/>
</group>
<item android:title="Communicate">
<menu>
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share"/>
<item
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send"/>
</menu>
</item>
</menu>
NavigationView实现OnNavigationItemSelectedListener点击监听
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
问题1:如何除掉侧滑的时候附带的背景阴影?
有图可见,侧滑的时候改变了背景透明度。
解决: idDrawerLayout.setScrimColor(Color.TRANSPARENT);设置当抽屉打开时,未被抽屉遮住部分的颜色。
问题2:如何防止点击侧滑的菜单的时候内容区域响应点击
看效果
在左菜单区域点击,内容区域响应点击事件,这肯定是不行的。当然这针对的是自定义布局,如果采用NavigationView搭配是没有问题的,关键还是看需求咯。
解决:
//侧滑点击监听
idDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
drawerView.setClickable(true);
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
在侧滑监听里监听onDrawerOpened方法,设置 drawerView.setClickable(true);即可。
问题3:如何将DrawerLayout背景色延伸至状态栏
解决方案:
将状态栏设为透明
根据StatusBar的值为Toolbar设置相应的paddingTop
为作为根布局的DrawerLayout设置setFitsSystemWindows(true)
为作为根布局的Drawerlayout设置setClipToPadding(false)
private void handleStatusBar() {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
WindowManager.LayoutParams manager=getWindow().getAttributes();
manager.flags=
(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS|manager.flags);
drawer.setFitsSystemWindows(true);
drawer.setClipToPadding(false);
}
}
问题4:如何主动开启或隐藏drawer
上述都是由drawer自己通过滑动或者点击来控制开启或者关闭。
主动开启视图
主动关闭视图
问题5:如何取消抽屉的滑动效果
锁定模式有四种:
LOCK_MODE_LOCKED_CLOSED:关闭抽屉的滑动操作并将抽屉收起
LOCK_MODE_LOCKED_OPEN:关闭抽屉的滑动操作并将抽屉打开
LOCK_MODE_UNDEFINED:将锁定模式重新设置到默认状态
LOCK_MODE_UNLOCKED:解锁对抽屉的滑动操作锁定
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT)
即可锁定手势滑动,只能主动去开启或者关闭drawer。
今天就总结到这把