Material Design 组件之NavigationView
今天来看一下 NavigationView 的使用,NavigationView 是一个标准的导航菜单,其菜单内容由菜单资源文件来填充,NavigationView 一般和 DrawerLayout 一起搭配使用构成抽屉菜单,分别由内容页和菜单页组成。
基本布局
可以直接使用 DrawerLayout 作为根布局,里面依次是内容布局和菜单布局,切记内容布局一定是在菜单布局的前面,可以这样理解菜单划出的时候肯定应该在内容布局之上,如果两者顺序相反,则影响菜单 Item 的点击事件以及菜单的滑动隐藏,当然如果有 ToolBar 等,可以按需添加到内容布局中,也可以 DrawerLayout 外,唯一区别是侧换菜单是否遮挡 ToolBar,基本使用参考如下:
1 <android.support.v4.widget.DrawerLayout
2 xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 android:id="@+id/drawer_layout"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:fitsSystemWindows="true">
8
9 <!--内容 -->
10
11 <!--菜单-->
12 <android.support.design.widget.NavigationView
13 android:id="@+id/navigation"
14 android:layout_width="wrap_content"
15 android:layout_height="match_parent"
16 android:layout_gravity="start"
17 app:menu="@menu/my_navigation_items" />
18 </android.support.v4.widget.DrawerLayout>
常用属性
下面是 NavigationView 的常用属性,具体如下:
1<!--菜单弹出方向-->
2android:layout_gravity="start"
3<!--菜单图标渲染的颜色-->
4app:itemIconTint="@color/colorPrimary"
5<!--菜单文字的颜色-->
6app:itemTextColor="@color/colorNormal"
7<!--菜单项背景颜色(组之间有间隔)-->
8app:itemBackground="@color/colorBackground"
9<!--菜单项-->
10app:menu="@menu/menu_navigation_view"
11<!--NavigationView的头部布局-->
12app:headerLayout="@layout/head_navigation_layout"
文字选中效果
如果美工比较用心会告诉点击时是那种颜色、按下是那种颜色或者是某种效果,此时就需要设置菜单项文字选中效果了,这里选择创建在 color 资源文件的形式来实现文字选中效果了,定义 color 资源文件如下:
1
2<selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <!--按下-->
4 <item android:color="@color/colorPress" android:state_pressed="true"/>
5 <!--选中-->
6 <item android:color="@color/colorCheck" android:state_checked="true"/>
7 <!--默认-->
8 <item android:color="@color/colorNormal"/>
9</selector>
然后,设置 NavigationView 的 itemTextColor 属性即可,具体如下:
1<!--设置菜单项颜色-->
2app:itemTextColor="@color/select_color_navigation"
当然,也可以在代码中设置,具体如下:
1//设置菜单项颜色
2ColorStateList colorStateList = getResources().getColorStateList(R.color.select_color_navigation);
3navigationView.setItemTextColor(colorStateList);
然后,设置对 NavigationView 菜单项选中的事件监听,具体如下:
1navigationView.setNavigationItemSelectedListener(this);
最后,在点击完成要设置该菜单项已被选中,具体如下:
1
2public boolean onNavigationItemSelected(@NonNull MenuItem item) {
3
4 switch (item.getItemId()){
5 case R.id.menu1:
6 Toast.makeText(this,"menu1",Toast.LENGTH_SHORT).show();
7 break;
8 //...
9 }
10 //设置菜单项选中
11 item.setCheckable(true);
12 //关闭Drawer
13// navDrawLayout.closeDrawers();
14 return true;
15}
图标与文字间距
使用 NavigationView 之后发现,菜单图标与菜单文字之间有一定的间距,看着有点宽,有一点强迫症必须稍微修改小一点,根据之前修改 FloatingActionButton 大小的经验,翻一下源码找设置这个间距的位置,查看 NavigationView 源码,最终在 NavigationMenuPresenter 中找到相关的 dimen 值,然后顺藤摸瓜找到与 Navigation 相关的几个 dimen 值,具体如下:
1public static final int design_navigation_elevation = 0x7f060064;
2public static final int design_navigation_icon_padding = 0x7f060065;
3public static final int design_navigation_icon_size = 0x7f060066;
4public static final int design_navigation_max_width = 0x7f060067;
5public static final int design_navigation_padding_bottom = 0x7f060068;
6public static final int design_navigation_separator_vertical_padding = 0x7f060069;
此时,在项目的 dimens 文件夹中创建名称相同的值覆盖即可,这里是修改 Menu 图标与文字之间的间距,所以我们只要设置:
1<!--修改NavigationView菜单图标与文字之间的间距-->
2<dimen name="design_navigation_icon_padding" tools:override="true">10dp</dimen>
至于其他相关的 dimen 值就不一一说明了,这样就修改了 Menu 图标与文字之间的间距。
案例
下面是一个 NavigationView 结合 DrawerLayout 的使用案例,布局如下:
1
2<LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:app="http://schemas.android.com/apk/res-auto"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:orientation="vertical">
8 <!--ToolBar-->
9 <android.support.v7.widget.Toolbar
10 android:id="@+id/navToolbar"
11 android:layout_width="match_parent"
12 android:layout_height="?attr/actionBarSize"
13 android:background="@color/colorPrimary" />
14
15 <android.support.v4.widget.DrawerLayout
16 android:id="@+id/navDrawLayout"
17 android:layout_width="match_parent"
18 android:layout_height="match_parent">
19 <!--内容-->
20 <LinearLayout
21 android:layout_width="match_parent"
22 android:layout_height="match_parent"
23 android:orientation="vertical">
24 <TextView
25 android:layout_width="match_parent"
26 android:layout_height="match_parent"
27 android:gravity="center"
28 android:text="@string/app_name"
29 android:textSize="18sp" />
30 </LinearLayout>
31 <!--菜单-->
32 <android.support.design.widget.NavigationView
33 android:id="@+id/navigationView"
34 android:layout_width="200dp"
35 android:layout_height="match_parent"
36 android:layout_gravity="start"
37 app:headerLayout="@layout/head_navigation_layout"
38 app:itemIconTint="@color/colorPrimary"
39 app:itemTextColor="@color/select_color_navigation"
40 app:menu="@menu/menu_navigation_view" />
41 </android.support.v4.widget.DrawerLayout>
42
43</LinearLayout>
显示效果
下面是显示效果,如下图所示:
最近总结了一下 Material Design 组件的使用,如果比较感兴趣可以在公众号回复关键字 MD 获取相关代码链接。
推荐阅读: