原文首发于微信公众号:jzman-blog,欢迎关注交流!

Material Design 系列文章:

  • Material Design组件之FloatingActionButton
  • Material Design组件之AppBarLayout
  • Material Design组件之CollapsingToolbarLayout

今天来看一下 NavigationView 的使用,NavigationView 是一个标准的导航菜单,其菜单内容由菜单资源文件来填充,NavigationView 一般和 DrawerLayout 一起搭配使用构成抽屉菜单,分别由内容页和菜单页组成。主要内容如下:

  1. 基本布局
  2. 常用属性
  3. 文字选中效果
  4. 图标与文字间距
  5. 案例
  6. 显示效果

基本布局

可以直接使用 DrawerLayout 作为根布局,里面依次是内容布局和菜单布局,切记内容布局一定是在菜单布局的前面,可以这样理解菜单划出的时候肯定应该在内容布局之上,如果两者顺序相反,则影响菜单 Item 的点击事件以及菜单的滑动隐藏,当然如果有 ToolBar 等,可以按需添加到内容布局中,也可以 DrawerLayout 外,唯一区别是侧换菜单是否遮挡 ToolBar,基本使用参考如下:

 <android.support.v4.widget.DrawerLayout  xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><!--内容 --><!--菜单--><android.support.design.widget.NavigationViewandroid:id="@+id/navigation"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"app:menu="@menu/my_navigation_items" /></android.support.v4.widget.DrawerLayout>
复制代码

常用属性

下面是 NavigationView 的常用属性,具体如下:

<!--菜单弹出方向-->
android:layout_gravity="start"
<!--菜单图标渲染的颜色-->
app:itemIconTint="@color/colorPrimary"
<!--菜单文字的颜色-->
app:itemTextColor="@color/colorNormal"
<!--菜单项背景颜色(组之间有间隔)-->
app:itemBackground="@color/colorBackground"
<!--菜单项-->
app:menu="@menu/menu_navigation_view"
<!--NavigationView的头部布局-->
app:headerLayout="@layout/head_navigation_layout"
复制代码

文字选中效果

如果美工比较用心会告诉点击时是那种颜色、按下是那种颜色或者是某种效果,此时就需要设置菜单项文字选中效果了,这里选择创建在 color 资源文件的形式来实现文字选中效果了,定义 color 资源文件如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><!--按下--><item android:color="@color/colorPress" android:state_pressed="true"/><!--选中--><item android:color="@color/colorCheck" android:state_checked="true"/><!--默认--><item android:color="@color/colorNormal"/>
</selector>
复制代码

然后,设置 NavigationView 的 itemTextColor 属性即可,具体如下:

<!--设置菜单项颜色-->
app:itemTextColor="@color/select_color_navigation"
复制代码

当然,也可以在代码中设置,具体如下:

//设置菜单项颜色
ColorStateList colorStateList = getResources().getColorStateList(R.color.select_color_navigation);
navigationView.setItemTextColor(colorStateList);
复制代码

然后,设置对 NavigationView 菜单项选中的事件监听,具体如下:

navigationView.setNavigationItemSelectedListener(this);
复制代码

最后,在点击完成要设置该菜单项已被选中,具体如下:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {switch (item.getItemId()){case R.id.menu1:Toast.makeText(this,"menu1",Toast.LENGTH_SHORT).show();break;//...}//设置菜单项选中item.setCheckable(true);//关闭Drawer
//    navDrawLayout.closeDrawers();return true;
}
复制代码

图标与文字间距

使用 NavigationView 之后发现,菜单图标与菜单文字之间有一定的间距,看着有点宽,有一点强迫症必须稍微修改小一点,根据之前修改 FloatingActionButton 大小的经验,翻一下源码找设置这个间距的位置,查看 NavigationView 源码,最终在 NavigationMenuPresenter 中找到相关的 dimen 值,然后顺藤摸瓜找到与 Navigation 相关的几个 dimen 值,具体如下:

public static final int design_navigation_elevation = 0x7f060064;
public static final int design_navigation_icon_padding = 0x7f060065;
public static final int design_navigation_icon_size = 0x7f060066;
public static final int design_navigation_max_width = 0x7f060067;
public static final int design_navigation_padding_bottom = 0x7f060068;
public static final int design_navigation_separator_vertical_padding = 0x7f060069;
复制代码

此时,在项目的 dimens 文件夹中创建名称相同的值覆盖即可,这里是修改 Menu 图标与文字之间的间距,所以我们只要设置:

<!--修改NavigationView菜单图标与文字之间的间距-->
<dimen name="design_navigation_icon_padding" tools:override="true">10dp</dimen>
复制代码

至于其他相关的 dimen 值就不一一说明了,这样就修改了 Menu 图标与文字之间的间距。

案例

下面是一个 NavigationView 结合 DrawerLayout 的使用案例,布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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:orientation="vertical"><!--ToolBar--><android.support.v7.widget.Toolbarandroid:id="@+id/navToolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="@color/colorPrimary" /><android.support.v4.widget.DrawerLayoutandroid:id="@+id/navDrawLayout"android:layout_width="match_parent"android:layout_height="match_parent"><!--内容--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="@string/app_name"android:textSize="18sp" /></LinearLayout><!--菜单--><android.support.design.widget.NavigationViewandroid:id="@+id/navigationView"android:layout_width="200dp"android:layout_height="match_parent"android:layout_gravity="start"app:headerLayout="@layout/head_navigation_layout"app:itemIconTint="@color/colorPrimary"app:itemTextColor="@color/select_color_navigation"app:menu="@menu/menu_navigation_view" /></android.support.v4.widget.DrawerLayout></LinearLayout>复制代码

显示效果

下面是显示效果,如下图所示:

最近总结了一下 Material Design 组件的使用,可以选择关注微信公众号:jzman-blog 获取最新更新,可以在公众号回复关键字 MD 获取相关代码链接。

转载于:https://juejin.im/post/5cdaea0d6fb9a031ef63d999

Material Design组件之NavigationView相关推荐

  1. Android Design Support Library 中控件的使用简单介绍(一)介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android

    介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android 2.1 . 这些组件在我看来就是对 Github中最近比较火的 android 组件进行 ...

  2. Material Design 组件之 CollapsingToolbarLayout

    CollapsingToolbarLayout 主要用于实现一个可折叠的标题栏,一般作为 AppBarLayout 的子 View 来使用,下面总结一下 CollapsingToolbarLayout ...

  3. Flutter 入门学习(五)— Material Design风格组件

    文章目录 1. 概述 2. App结构和导航组件 2.1 MaterialApp(应用组件) 2.1.1 设置主页 2.1.2 路由处理 2.1.3 自定义主题 2.2 Scaffold(脚手架组件) ...

  4. Material Design 开发利器:Android Design Support Library 介绍

    Material Design 开发利器:Android Design Support Library 介绍 本文翻译自著名博客 Android Developers,原作者是 Ian Lake,点击 ...

  5. Google将Material Design带到CSS、HTML与JavaScript上

    Google Material Design Lite(MDL)旨在将Material Design感官带到网站上.Material Design是一种视觉语言,是Android的标准,同时也是Goo ...

  6. Vue2.0 的 Material Design UI 组件库 Muse-UI

    Muse-UI 基于 Vue2.0 的 Material Design UI 组件库 安装 npm install muse-ui --save 使用 import Vue from 'vue' im ...

  7. 开启Fluter基础之旅二-------Future再论、常用组件、Material Design风格组件学习

    Future再论: 这里在继续往下学习之前,先来看一下Dart语言关于Event-Queue和Microtask Queue需要注意的一个小点,这个在之前https://www.cnblogs.com ...

  8. 开启Fluter基础之旅三-------Material Design风格组件、Cupertino风格组件、Flutter页面布局篇...

    Material Design风格组件: 继续接着上一次https://www.cnblogs.com/webor2006/p/12545701.html的Material Design进行学习. A ...

  9. Material Design Lite组件之徽章

    1.介绍 Material Design Lite(MDL)徽章组件是一个屏幕上的通知元素.徽章由一个小圆圈组成,通常包含数字或其他字符,这些圆圈出现在另一个物体附近.徽章既可以是通知者,也可以是与对 ...

最新文章

  1. java 画笔粗细_用JAVA做个画笔,有画笔和橡皮功能就行。越简单越好
  2. 智能视觉组参赛总结及体会- 西安邮电大学 - AI小布丁
  3. js 获取域名_确定你会使用JS操作Url吗?
  4. 《x86汇编语言:从实模式到保护模式》读书笔记之后记
  5. oracle排序使用,很多中函数,不同的效果
  6. mysql function select 赋值_MySql 进阶
  7. insert with special ID
  8. Tensorflow 入门手册(代码与原理释义)
  9. bzoj1012: [JSOI2008]最大数maxnumber [单调队列]
  10. some ubuntu shell commands
  11. 一篇Word论文的字体格式是什么?
  12. ChineseWiki︱百万中文维基百科词条下载与整理
  13. 专项审计有哪些?专项审计报告包含哪些内容?
  14. duang!各位期待的傻猴更新稳定版来了~
  15. Java OOP 异常
  16. eclipse 下载和安装教程(初学者,2022最新版)
  17. 基于逻辑回归(Logistic Regression)的糖尿病视网膜病变(Diabetic Retinopathy)检测
  18. 2022 年 best 大数据认证:康奈尔大学,Intellipaat,SAS, USDI, Cloudera CCA175 Hadoop
  19. js验证银行卡号,并自动识别银行信息。js验证手机码。js验证数字
  20. 邢台市工业机器人集成商_十大优秀工业机器人系统集成商分析

热门文章

  1. 吴恩达机器学习(八)偏差与方差
  2. 2018.12.17-dtoj-1170-最长公共子串
  3. python用户界面画图_通过海龟绘图学习Python-01
  4. linux系统里route -n不起作用,Linux系统中的route解析
  5. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
  6. JSP 文件上传下载系列之一[基本方式上传文件]
  7. 四张照片合成一张怎么弄_我在朋友圈发了这张照片后,所有人都求问教程
  8. centos 怎样显示metric_centos7系列问题
  9. webstorm护眼绿柔主题分享(JetBrains都可用)
  10. oracle中pga指什么,oracle中pga内存分配原则