效果图

添加依赖

由于用到v4包下DrawerLayout,v7包下Toolbar,和android.support.design下的NavigationView,需要在gradle中作如下配置:

v4包系统默认引入
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'

DrawerLayout

如果我们希望整个界面整体可以侧滑,我们可以把DrawerLayout作为整个界面的根布局。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/dl_layout"android:layout_width="match_parent"android:layout_height="match_parent" >  <!--内容界面布局--><!--左菜单界面布局--><!--右菜单界面布局-->
</android.support.v4.widget.DrawerLayout>

DrawerLayout为了识别或智能的控制内容布局、左菜单布局、右菜单布局,对三者的放置顺序做了限定,要求内容布局必须放在其它两个布局的前面

如果把菜单布局放到内容布局前面,运行程序会报类型转换异常,这也说明它对放置顺序做了限定,与此同时需要在左菜单根布局添加:

android:layout_gravity = "start"或"left"控制它在左边,DrawerLayout识别它作为左菜单布局,同样如果有右菜单界面,则右菜单根布局需要添加:

android:layout_gravity = "end"或 "right"控制它在右边,DrawerLayout识别它为右菜单布局。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/dl_layout"android:layout_width="match_parent"android:layout_height="match_parent" ><!--内容界面布局--><LinearLayoutandroid:id="@+id/ll_content"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ></LinearLayout><!--左菜单界面布局--><RelativeLayoutandroid:id="@+id/rl_left_menu"android:layout_width="300dp"android:layout_height="match_parent"android:layout_gravity="start"android:background="#ffffff" ></RelativeLayout><!--右菜单界面布局--><RelativeLayoutandroid:id="@+id/rl_right_menu"android:layout_width="300dp"android:layout_height="match_parent"android:layout_gravity="end"android:background="#ffffff" ></RelativeLayout></android.support.v4.widget.DrawerLayout>

对按钮添加点击事件来控制侧边栏的打开和关闭:

mLeftIb.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//判断左菜单是否打开,如果没有,则的开,否则关闭左菜单if(!mDrawerL.isDrawerOpen(Gravity.LEFT)){Toast.makeText(MainActivity.this, "打开左菜单", Toast.LENGTH_SHORT).show();mDrawerL.openDrawer(Gravity.LEFT);}else{mDrawerL.closeDrawer(Gravity.LEFT);}}});

NavigationView

我们做抽屉菜单的时候,左边滑出来的那一部分的布局都是由我们自己来定义的,自己写的话,花点时间也能做出来好看的侧拉菜单,但总是要耗费时间,于是Google在5.0之后推出了NavitationView,就是我们左边滑出来的那个菜单。这个菜单整体上分为两部分,上面一部分叫做HeaderLayout,下面的那些点击项都是menu,这样的效果如果我们要自己写肯定也能写出来,但是没有必要,既然Google提供了这个控件,那我们就来看看这个控件要怎么用吧。

和普通的侧拉菜单制作方式一样,首先所有的东西还是都放在一个DrawerLayout中,只不过这次我们把左边滑出菜单的布局用一个NavigationView来代替,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true">
<android.support.v4.widget.DrawerLayoutandroid:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent">                                                                            <android.support.design.widget.AppBarLayoutandroid:id="@+id/appbar_layout"android:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?actionBarSize"android:background="?attr/colorPrimary"app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout>
<!--内容 -可切换Fragment-->
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"app:layout_behavior="@string/appbar_scrolling_view_behavior"> <TextViewandroid:id="@+id/message"android:layout_width="wrap_content"android:layout_height="wrap_content" /> <Buttonandroid:id="@+id/nextButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="测试" />
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
<!--左侧导航菜单-->
<android.support.design.widget.NavigationViewandroid:id="@+id/navigation_view"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"android:background="@color/windowBackground"app:headerLayout="@layout/navigation_header"app:menu="@menu/drawer" />
</android.support.v4.widget.DrawerLayout>
</FrameLayout>

分别解释一下这里边几个属性的含义:

1.Android:layout_gravity=”left”属性表示该View是左边的滑出菜单,这个属性的含义不用多说,这是DrawerLayout使用方式中的知识点。NavigationView需要设置 android:layout_gravity=”start”
2.app:headerLayout=”@layout/header_layout”表示引用一个头布局文件,这个头就是我们在上面看到的那个背景图片,包括背景图片上面的显示用户名的控件等等。
3.app:menu=”@menu/main”表示引用一个menu作为下面的点击项

头布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/ll_navigation_header"android:layout_width="match_parent"android:layout_height="192dp"android:background="?attr/colorPrimary"android:gravity="center"android:orientation="vertical"android:padding="16dp"android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageViewandroid:id="@+id/profile_image"android:layout_width="72dp"android:layout_height="72dp"android:layout_marginTop="20dp"android:src="@mipmap/logo"/>
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:gravity="center"android:text="HSY"android:textColor="#ffffff"android:textAppearance="@style/TextAppearance.AppCompat.Body1"android:textSize="18sp" />
</LinearLayout>

再来看看menu文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools">
<group android:checkableBehavior="single">
<itemandroid:checked="true"android:id="@+id/navigation_item_home"android:icon="@drawable/iconfont_home"android:title="首页" />
<itemandroid:id="@+id/navigation_item_ganhuo"android:icon="@drawable/iconfont_source"android:title="干货" />
<itemandroid:id="@+id/navigation_item_blog"android:icon="@drawable/iconfont_blog"android:title="我的博客" />
<itemandroid:id="@+id/navigation_item_custom_view"android:icon="@drawable/iconfont_custom_view"android:title="自定义View" />
<itemandroid:id="@+id/navigation_item_snackbar"android:icon="@drawable/iconfont_custom_view"android:title="Snackbar演示" />
<item android:title="其他">
<menu>
<itemandroid:id="@+id/navigation_item_switch_theme"android:checkable="true"android:icon="@drawable/iconfont_skin"android:title="主题换肤" />
<itemandroid:id="@+id/navigation_item_about"android:checkable="true"android:icon="@drawable/iconfont_about"android:title="关于" />
</menu>
</item>
</group>
</menu>

1.在布局文件中添加app:itemIconTint=”@color/blue”属性,表示设置图片的颜色全都为蓝色,如果我想让图片就是显示他本身的颜色该怎么办呢?在Java代码中调用如下方法:

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);  navigationView.setItemIconTintList(null);  

还有下面两个常用的API:

1.app:itemBackground="@color/colorAccent"设置每一个item的背景颜色
2.app:itemTextColor=""设置item的背景颜色

2.如果我想在NavigationView的item之间添加上一条分隔线呢?很简单,只需要在menu中将相应的item放到一个group中,并给该group取一个id即可,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/g1">
<item  android:id="@+id/favorite"  android:icon="@mipmap/ic_launcher"  android:title="收藏"/>
<item  android:id="@+id/wallet"  android:icon="@mipmap/ic_launcher"  android:title="钱包"/>
</group>
<group android:id="@+id/g2">
<item  android:id="@+id/photo"  android:icon="@mipmap/ic_launcher"  android:title="相册"/>
</group>
<item  android:id="@+id/file"  android:icon="@mipmap/ic_launcher"  android:title="文件"/>
</menu>

3.隐藏某个菜单列表项,公司项目会根据你是否是管理员,来控制某个菜单列表项的显示和隐藏,因此就出现了这个问题。

MenuItem menuItem = navigationView.getMenu().findItem(R.id.some_menu_item);
menuItem.setVisible(false); // true 为显示,false 为隐藏

4. 使用 NavigationView 时透明状态栏的处理

Android App 沉浸式状态栏解决方案

NavigationView中的事件监听

1.头部点击事件

处理头部点击事件,我们需要先获得到头部控件,在Java代码中我们可以通过下面的方式获得头部控件,

//获取头布局文件
View headerView = navigationView.getHeaderView(0);  

然后通过调用headerView中的findViewById方法来查找到头部的控件,设置点击事件即可。

2.item点击事件

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {  @Override public boolean onNavigationItemSelected(MenuItem item) { //在这里处理item的点击事件  return true;
}
});

安卓项目实战之DrawerLayout+NavigationView+ToolBar实现抽屉式侧边栏效果相关推荐

  1. 从零到完成安卓项目实战【安卓端+后端】

    今天下雨了,出不去了,在家开发一个安卓系统. 因为平时自己喜欢打篮球,那就开发一个篮球相关的系统吧:NBA安卓系统. 一,功能介绍 APP主要具备网上篮球约球.篮球交流.线上NBA观赛,力求软件界面友 ...

  2. 安卓项目实战之强大的网络请求框架okGo使用详解(一):实现get,post基本网络请求,下载上传进度监听以及对Callback自定义的深入理解

    1.添加依赖 //必须使用 compile 'com.lzy.net:okgo:3.0.4'//以下三个选择添加,okrx和okrx2不能同时使用,一般选择添加最新的rx2支持即可 compile ' ...

  3. 安卓项目实战之快速集成emojicon表情开源库

    效果图: 开始编码: 1.添加依赖 compile 'io.github.rockerhieu:emojicon:1.4.1' 2.布局文件代码: <LinearLayout xmlns:and ...

  4. 安卓项目实战之仿魅族的酷炫Banner轮播效果

    效果图 GitHub地址:https://github.com/pinguo-zhouwei/MZBannerView 添加依赖 1,project的build.gradle添加: allprojec ...

  5. 安卓项目实战之Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    https://blog.csdn.net/guolin_blog/article/details/8689140

  6. 安卓项目实战之:Android常用的5种加密方式

    前言 按加密结果是否可以被解密分为可逆和不可逆: 1,不可逆: MD5(Message-Digest消息摘要):不可逆,长度固定(32位),容易计算,仅一字节只差加密结果都会有很大区别 通常情况下为了 ...

  7. android简单app实例_Android安卓小项目实战视频教程集锦

    Android安卓小项目实战视频教程,点击进入视频教程: 一.安卓项目视频教程: 1蓝牙聊天APP介绍-分步骤介绍一个简单安卓蓝牙APP的开发过程 - 西瓜视频 2蓝牙聊天开发流程-分步骤介绍一个简单 ...

  8. 【项目实战课】从零掌握安卓端Pytorch原生深度学习模型部署

    欢迎大家来到我们的项目实战课,本期内容是<从零掌握安卓端Pytorch原生深度学习模型部署>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战 ...

  9. 最新AndroidStudio项目实战开发安卓播放器(手机影音)

    AndroidStudio项目实战开发安卓播放器(手机影音) 下载地址:百度网盘

最新文章

  1. C++实现CString和string的互相转换
  2. 调整cisco参数设置
  3. MySQL FORMAT函数示例
  4. 【VMware vSAN 6.6】5.8.自动化:vSAN硬件服务器解决方案
  5. Facebook如何将QUIC应用于数十亿流量传输
  6. sklearn中GBDT的一些参数、属性、方法的理解
  7. linux下conda换源
  8. C++程序设计随笔(二)
  9. 禁用红蜘蛛自启的简单办法
  10. Misc 自动拼图 CTF
  11. linux格式化叫大硬盘命令,Linux_format命令 参数说明,格式化 格式化指定卷中的磁盘 - phpStudy...
  12. 【ENOVIA 服务包】知识重用解决方案 | 达索系统百世慧®
  13. 练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。
  14. html pdf 模板,记一次 HTML 模板 转 PDF
  15. 字符串匹配,从BF 到 RK 到 KMP
  16. PMP第13章知识点回顾,练习题
  17. video标签无法播放视频
  18. SPARQL中常见的关键字含义(PREFIX,FILTER,OPTIONAL等)
  19. java 实现http/ftp下载,支持迅雷地址转换的草稿
  20. 移动互联应用开发者的乐园

热门文章

  1. java编写电器商店管理系统,设计家电销售管理系统
  2. Nginx官方文档(十五)【HTTP之ngx_http_dav_module|ngx_http_empty_gif_module|ngx_http_f4f_module】
  3. 50. 测试题(答案详析)
  4. 是不是老了,总是怀念过去的岁月
  5. 【洞见研报】研报速读:东兴证券——CPU生态价值与机遇研究(CPU,构架,国产替代)
  6. background属性详解
  7. tcpdump与wireshark
  8. dllhost.exe病毒清除办法
  9. 2020年 Java面试题整理 最新Java面试题2020
  10. PHPCMS安装及调用代码