DrawerLayout实现侧滑布局问题总结

版权声明:本文为博主原创文章,码字不易,转载请注明原文地址,谢谢。 https://blog.csdn.net/qq_16131393/article/details/54019715

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

今天就总结到这把

阅读更多
换一批

没有更多推荐了,返回首页