Material Design 組件之NavigationView

原文首發於微信公衆號:jzman-blog,歡迎關注交流!

Material Design 系列文章:java

今天來看一下 NavigationView 的使用,NavigationView 是一個標準的導航菜單,其菜單內容由菜單資源文件來填充,NavigationView 通常和 DrawerLayout 一塊兒搭配使用構成抽屜菜單,分別由內容頁和菜單頁組成。主要內容以下:android

  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.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 的經常使用屬性,具體以下:app

<!--菜單彈出方向-->
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 資源文件以下:ide

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

固然,也能夠在代碼中設置,具體以下:post

//設置菜單項顏色
ColorStateList colorStateList = getResources().getColorStateList(R.color.select_color_navigation);
navigationView.setItemTextColor(colorStateList);

而後,設置對 NavigationView 菜單項選中的事件監聽,具體以下:this

navigationView.setNavigationItemSelectedListener(this);

最後,在點擊完成要設置該菜單項已被選中,具體以下:spa

@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 值,具體以下:code

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>

顯示效果

下面是顯示效果,以下圖所示:

clipboard.png

最近總結了一下 Material Design 組件的使用,能夠選擇關注微信公衆號:jzman-blog 獲取最新更新,能夠在公衆號回覆關鍵字 MD 獲取相關代碼連接。
jzman-blog

相關文章
相關標籤/搜索