android5.0+(NavigationView)

Android 实现左侧导航栏:NavigationView是什么?NavigationView和Navigation搭配使用 1)左侧导航栏效果图2)NavigationView是什么?3)NavigationView和Navigation搭配使用4)NavigationView的其他方法。 阅读详情

随着 Google I/O 2015,新的 Android Design Support Library 也出现了。

Android Design Support Library 给开发者带来了一些重要的 Material Design 组件,并且向下兼容到 Android 2.1, Navigation View 就是其中之一,可用于方便地创建导航抽屉。

效果如下:

因为需要向下兼容,所以以下内容的 Activity 均继承于 AppCompatActivity ,使用的主题的父主题均为 AppCompat 的主题。

基本步骤

通过 Navigation View 创建导航抽屉首先自然需要引入这个支持包:

compile 'com.android.support:design:22.2.0'

布局文件中加入以下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
< android.support.v4.widget.DrawerLayout
   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.support.design.widget.NavigationView
       android:layout_width = "wrap_content"
       android:layout_height = "match_parent"
       android:layout_gravity = "start"
       app:headerLayout = "@layout/drawer_header"
       app:menu = "@menu/drawer" />
</ android.support.v4.widget.DrawerLayout >

其中 app:headerLayout 用于指定一个任意的布局,作为导航抽屉的顶部,如效果图中的紫色带 Username 字样部分。

而 app:menu 用于指定导航抽屉的菜单项,具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
< menu  xmlns:android = "http://schemas.android.com/apk/res/android" >
   < group  android:checkableBehavior = "single" >
     < item
       android:id = "@+id/nav_home"
       android:icon = "@drawable/ic_dashboard"
       android:title = "Home"  />
     < item
       android:id = "@+id/nav_messages"
       android:icon = "@drawable/ic_event"
       android:title = "Messages"  />
     < item
       android:id = "@+id/nav_friends"
       android:icon = "@drawable/ic_headset"
       android:title = "Friends"  />
     < item
       android:id = "@+id/nav_discussion"
       android:icon = "@drawable/ic_forum"
       android:title = "Discussion"  />
   </ group >
   < item  android:title = "Sub items" >
     < menu >
       < item
         android:icon = "@drawable/ic_dashboard"
         android:title = "Sub item 1"  />
       < item
         android:icon = "@drawable/ic_forum"
         android:title = "Sub item 2"  />
     </ menu >
   </ item >
</ menu >


其中通过 <group android:checkableBehavior="single"> 设定一组菜单项为至多只有一个可被选中,非常适合用于通过导航抽屉切换呈现的 Fragment,若需要默认选中一个菜单项则只需要给指定 item 加上 android:checked="true" 即可。并且可以通过子菜单的形式显示分割线和子标题。

到此为止布局文件部分就完成了,接下来只需要在Activity中设置监听器即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if  (navigationView !=  null ) {
   navigationView.setNavigationItemSelectedListener( new  NavigationView.OnNavigationItemSelectedListener() {
     @Override
     public  boolean  onNavigationItemSelected(MenuItem menuItem) {
       //切换相应 Fragment 等操作
       menuItem.setChecked( true );
       mDrawerLayout.closeDrawers();
       return  false ;
     }
   });
}

至此导航抽屉就基本完成了,但 Material Design 中建议导航抽屉应该在 status bar 上也显示,而 Android 5.0 及以上版本支持这一特性,因此还需要进一步处理。

针对 Android 5.0 及以上版本

首先由 window 来绘制 status bar 的背景,否则 status bar 为系统默认背景(原生是黑色背景),而 AppCompat 的主题已带如下属性:

<item name="android:windowDrawsSystemBarBackgrounds">true</item>

确保 Android 5.0 以上版本使用的主题中并没有把该属性设置成 false 即可。

而通过 window 来绘制 status bar 的背景并不一定是我们需要的最终结果,因为 status bar 的背景在需要呈现的内容上和导航抽屉上不一定是一样的,而通过 window 来绘制则肯定是一样的,因此把 window 绘制的 status bar 的背景设置为透明,在 Android 5.0 以上版本使用的主题中加入如下代码:

<item name="android:statusBarColor">@android:color/transparent</item>

接下来只需要 DrawerLayout 来接管 status bar 的背景的绘制工作即可,给布局文件中的 DrawerLayout 加入如下属性:

android:fitsSystemWindows="true"

此时导航抽屉已经能够显示在 status bar 上。

至此理论上 Android 2.1 以上版本都能正常显示导航抽屉了,完整代码可参照 Github 上的一个 Demo 。

通过 Navigation View 能够实现上图所示的导航抽屉,但有两处若不设置依旧会占着控件,十分不合理,分别是图标以及 4 处的子菜单标题。所以若需要没有图标的项目或单独加分割线则还得考虑使用自定义布局的形式实现导航抽屉。

但 Navigation View 优点依旧很明显,首先设置的图标经测试会被改变成合适的颜色,无论是选中还是未选中状态,无需任何代码即可达成下图效果,若使用自定义布局的形式可能需要设计未选中和选中两套图标或自己写代码动态改变颜色。


若还是觉得 Navigation View 不够好,又觉得自定义太麻烦,并且只需要兼容到 Android 2.3.3 或以上版本的话可以考虑使用使用 MaterialDrawer 开源控件,十分强大,能够实现 Navigation View 所有能够实现的效果,并且自由度更高,我通过这个开源控件完成了我毕业设计中所需的两个导航抽屉,具体效果如下图所示:

参考资料

Android Design Support Library (Android Developers Blog)


Android 侧滑菜单的实现(NavigationView) 很早之前就像写个android的侧滑菜单加入到项目中了,但是很多给的都是密密麻麻的代码,今天看到了简单快速的实现方法:通过NavigationView+DrawLayout来实现侧滑菜单的功能。Google I/O 2015 给大家带来了AndroidDesign Support Library,对于希望做md风格的app的来说,简直是天大的喜讯.NavigationView是是Google 阅读详情

相关推荐

android BottomNavigationView(底部导航栏)

android BottomNavigationView(底部导航栏)

Android BottomNavigationView 底部导航栏使用详解

BottomNavigationView是官方提供可以实现底部导航的组件,最多支持5个item,主要用于功能模块间的切换,默认会包含动画效果。

Billy_Zuo的博客 5614

xamarin fragment底部导航栏

xamarin android 使用fragment底部导航栏,原文链接http://blog.csdn.net/kebi007/article/month/2017/04

【Xamarin】爬坑笔记NavgationView

设置NavgationView的头部和菜单的方法 NavigationView navigationView = FindViewById<NavigationView>(Resource.Id.nav_view); //获取菜单Header View view = navigationView.GetHeaderView(0); //填充头部信息 public void Fi...

undefined 310

android新特性:DrawerLayout与NavigationView配合使用

android新特性:DrawerLayout与NavigationView配合使用

Android使用导航视图NavigationView的代码例子

Android使用导航视图NavigationView的代码例子。用于演示结合DrawerLayout与NavigationView实现侧滑菜单的功能,并给出了自定义导航视图的一个例子。

android NavigationView解析

NavigationView实际上是一个FrameLayout,这个FrameLayout中又包含了一个RecyclerView。如果用户设置了Header布局,那么NavigationView就把这个Header作为这个RecyclerView的第一个Item View,在Header的下面就是菜单列表。通过这种封装使得构建用户菜单变得非常简单,而不需要用户每次都通过RecyclerView手动...

且听真言 1784

BottomNavigationView实现底部导航

tab切换动画,和fragment结合,tab点击水波纹效果

2024最新Android大厂面试真题大全,Android开发知识点

*一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

F1520080的博客 679

LightGBM处理类别特征和缺失值有多省心?一个真实业务数据案例带你上手

本文通过真实电商数据案例,详细解析了LightGBM如何高效处理类别特征和缺失值。相比传统方法,LightGBM仅需一行代码即可自动处理高基数类别特征和缺失值,大幅提升模型训练效率和预测准确度,特别适合业务场景中的脏数据处理。

weixin_30689307的博客 460

智能车竞赛飞檐走壁组赛道制作全攻略:从电磁线铺设到立体元素搭建

本文提供了智能车竞赛飞檐走壁组赛道制作的完整指南。从电磁线选材、电流控制与精准铺设等基础入手,详细解析了垂直墙面、圆筒、跷跷板等核心立体元素的构建技巧与过渡处理。重点分享了确保赛道稳定、符合规则且便于调试的实战经验,帮助参赛队伍搭建可靠的立体赛道,为车模算法调试奠定坚实基础。

weixin_29292535的博客 1284

Android5.0之NavigationView的使用

转自: Android5.0之NavigationView的使用 导航菜单的制作方式多种多样,网上也有各种炫酷效果的具体实现方式,那么今天我主要是想来说说Google在Android5.0之后推出的NavigationView的具体使用方式。 NavigationView在很多App上都已经可以看到其效果图,国内的比如知乎(侧拉菜单滑出来的那一部分属于NavigationView),

菜鸟的博客 2879

Qcom camera hal简介

Qcom camera hal简介

weixin_42136255的博客 7770

安卓NavigationView使用方法

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

disrm84160的博客 997

(UE4 4.27) HISM性能优化:从空间剔除到合批渲染的实战解析

本文深入解析了UE4 4.27中HISM(UHierarchicalInstancedStaticMesh)组件的性能优化原理与实战技巧。核心在于利用其N叉树空间结构实现高效的CPU视锥剔除,并结合GPU实例化进行合批渲染。文章详细探讨了从控制叶子节点粒度、平衡剔除精度与渲染效率,到结合LOD系统等关键参数的调优方法,为开放世界或大场景的植被性能瓶颈提供了系统解决方案。

weixin_29015051的博客 328

高通SA8295P音频接口深度解析:全面掌握SA8295P的LS-I2S、PCM/TDM与高性能音频处理技术设计

SA8295P提供丰富的音频接口选项,包括LS-I2S、PCM/TDM和HS-I2S接口,具备灵活的配置选项,适合各种高保真音频和高速数据传输应用。结合LS-I2S和PCM/TDM接口:在复杂的音频编解码器设计中,可结合使用LS-I2S和PCM/TDM接口,以处理和传输不同的音频数据流。使用HS-I2S接口:在软件定义无线电(SDR)系统中,高速I2S接口可处理高速数据流,如无线电信号的解码和处理。LS-I2S(低速I2S)接口是SA8295P的一部分,提供了丰富的音频数据传输选项。

weixin_43199439的博客 1408

安卓之NavigationView使用

安卓之NavigationView使用 在android5.0后,google提出了meteral design这样的一个设计理念之后,提供给用户官方的侧边栏的控件,这就是NavigationView。它不仅严格按照Material Design的要求来进行设计,而且还可以将滑动菜单页面的实现变得非常简单。 因为这个控件是在Design Support库中提供的,首先我们就需要将这个库引入到项目中才行。我在上一篇《安卓之CircleImageView解析》中有介绍在这里我就不在介绍了。 首先创建一个安卓项目

小鹿麋鹿的博客 1920

InvocationException: GraphViz‘s executables not found【BUG已解决】

在机器学习框架中遇到了一个bug:安装了GraphViz模块后,在对着sklearn的决策树文档操作输出决策树模型结果时,还是爆出了如下的错误: 报错位置为: 报错语句为:网上很多答案告诉我们,要我们安装GraphViz模块,然而并不对! 如下,我安装了GraphViz,但是还是报错了。 所以说问题不在这,我查阅质料发现,改正这个bug的方法有一个:下文详细描述。解决bug为: 1.去graphviz.官方下载自己电脑符合的操作系统的安装包:2,安装的时候,记住自己安装在电脑里的位置:以我的电脑为例,我的

一键难忘的博客 3968
上一篇: Android studio用的几个插件
下一篇: android5.0+(Toolbar)
dalongjun
博客等级 码龄11年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值