• Material Design 组件之NavigationView


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

    基本布局

    可以直接使用 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.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 资源文件如下:

    <?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"?>
    <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>
    

    显示效果

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

    NavigationView

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

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/jzmanu/p/10284774.html
Copyright © 2020-2023  润新知