原文首发于微信公众号:jzman-blog,欢迎关注交流!php
Material Design 系列文章:java
今天来看一下 NavigationView 的使用,NavigationView 是一个标准的导航菜单,其菜单内容由菜单资源文件来填充,NavigationView 通常和 DrawerLayout 一块儿搭配使用构成抽屉菜单,分别由内容页和菜单页组成。主要内容以下:android
能够直接使用 DrawerLayout 做为根布局,里面依次是内容布局和菜单布局,切记内容布局必定是在菜单布局的前面,能够这样理解菜单划出的时候确定应该在内容布局之上,若是二者顺序相反,则影响菜单 Item 的点击事件以及菜单的滑动隐藏,固然若是有 ToolBar 等,能够按需添加到内容布局中,也能够 DrawerLayout 外,惟一区别是侧换菜单是否遮挡 ToolBar,基本使用参考以下:bash
<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.NavigationView android: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 资源文件以下:app
<?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 属性便可,具体以下:ide
<!--设置菜单项颜色-->
app:itemTextColor="@color/select_color_navigation"
复制代码
固然,也能够在代码中设置,具体以下:布局
//设置菜单项颜色
ColorStateList colorStateList = getResources().getColorStateList(R.color.select_color_navigation);
navigationView.setItemTextColor(colorStateList);
复制代码
而后,设置对 NavigationView 菜单项选中的事件监听,具体以下:post
navigationView.setNavigationItemSelectedListener(this);
复制代码
最后,在点击完成要设置该菜单项已被选中,具体以下: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"?>
<LinearLayout 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:orientation="vertical">
<!--ToolBar-->
<android.support.v7.widget.Toolbar android:id="@+id/navToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" />
<android.support.v4.widget.DrawerLayout android:id="@+id/navDrawLayout" android:layout_width="match_parent" android:layout_height="match_parent">
<!--内容-->
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<TextView android: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.NavigationView android: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 获取相关代码连接。