DrawerLayout实现侧滑布局问题总结

来源:互联网 发布:消费资本论是传销 知乎 编辑:程序博客网 时间:2024/06/06 00:30

本片是对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。

今天就总结到这把

1 0
原创粉丝点击