本文為原創(chuàng)陌僵,轉(zhuǎn)載請注明出處http://www.reibang.com/p/e1781381d086
先來張效果圖感官認識一下
1. 綁定Header
在布局文件的NavigationView定義中添加app:headerLayout="@layout/nav_header_main"
艾岂,效果就是上圖顯示的有圖片背景區(qū)域所在的那一部分。
這樣綁定發(fā)現(xiàn)HeaderLayout中的android:fitsSystemWindows="true"
屬性不起作用
通過NavigationView的getHeaderView(Int)方法可以獲取到HeaderLayout對應的View范嘱,從而通過View的findViewById方法進一步操作子View。
2.綁定菜單
app:menu="@menu/home_left_drawer_menu"
示例:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group>
<item
android:icon="@drawable/ic_setting_24dp"
android:title="設置" />
</group>
<item android:title="中間菜單"/>
<group>
<item
android:icon="@drawable/ic_setting_24dp"
android:title="設置" />
</group>
</menu>
<item>就是定義一個菜單項若贮。
<group>是對菜單進行分組奈应,網(wǎng)上說用了這個標簽把菜單包起來之后,這一組菜單的頂部就會顯示一個分割線账磺,如上圖效果圖中的那條橫線
**實際用上述代碼芹敌,并不會產(chǎn)生分割線,這個標簽僅僅是定義分組垮抗,然后可以具備一個組的一些性質(zhì)氏捞,具體見group標簽的屬性
備注:這個描述有一定問題,后面會說明
**
使用上面定義的菜單冒版,運行效果如下:
那分割線是如何來的
示例如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="菜單1"/>
<item android:title="菜單2標題">
<menu>
<item
android:icon="@drawable/qr_logo"
android:title="子菜單1" />
<item
android:icon="@drawable/ic_setting_24dp"
android:title="子菜單2" />
</menu>
</item>
</menu>
我門可以直觀的從上面發(fā)現(xiàn)液茎,‘菜單2標題’包涵了一個子<menu>的定義,運行效果如下:
這種情況辞嗡,子<menu>所在的<Item>頂部就會有一條分割線捆等,但是有點不同的就是‘菜單2標題’就類似于標題一樣的存在了,跟‘子菜單1’欲间,‘子菜單2’有所區(qū)別楚里。
這下子,分割線是有了猎贴,并且還額外贈送了一個標題班缎,但是有些時候我門并不希望有標題的存在,我們僅僅是想在菜單之間增加一些分割線進行分組她渴,那如果實現(xiàn)呢达址?
在后來的使用中發(fā)現(xiàn),之前上面添加了‘備注’地方的語句表述有一定問題趁耗。
<group>標簽能夠產(chǎn)生分割線沉唠,關鍵點在于設置group的id值
3. 設置菜單圖標顏色
app:itemIconTint="@color/colorPrimary"
在上面的最后一張效果圖中,大家應該能夠發(fā)現(xiàn)苛败,‘子菜單1’的圖標是黑黑的一坨满葛,但是實際這個圖標是一個基本的png圖標,是有顏色有形狀的罢屈。那為什么是黑乎乎的一坨呢嘀韧,我門先指定以下圖標的顏色看下效果。
圖片‘子菜單2’良好的運行了缠捌,‘子菜單1’應該也算良好的運行了(從黑乎乎的一坨變成了有顏色的一坨)锄贷。
這下我門來分析一下兩者的區(qū)別。
- 先直接說‘菜單2’,這個圖標我是使用的矢量圖谊却。
- 那xml邊寫的shape會不會像矢量圖那樣的效果呢柔昼?
我寫了一個shape,代碼如下炎辨,使用的時候也是黑黑的一坨捕透。效果圖就不上了,因為這是我后來測試驗證的蹦魔。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="@android:color/white"/>
<stroke
android:width="1dp"
android:color="@color/black" />
</shape>
- ‘菜單1’是一個常規(guī)的PNG圖標
其實從上面的兩張效果圖可以隱約猜想激率,設置那個屬性就好比是在菜單的上面弄了一層遮罩,那么我門就去掉這個遮罩勿决。
先嘗試app:itemIconTint="@null"
,這樣設置之后乒躺,菜單是顯示了自身的顏色,但也僅僅只是‘菜單2’低缩,菜單1還是一坨嘉冒。
關鍵方法:調(diào)用NavigationView.setItemIconTintList(null)
進行設置,這樣菜單就可以顯示自身的效果了
4. 動態(tài)隱藏菜單項
使用NavigationView.getMenu().findItem(int id)
即可獲取到MenuItem對象咆繁,然后調(diào)用setVisible(boolean)方法設置即可讳推。
上述就是對NavigationView的基本使用,其它的就是去了解NavigationView/Menu的屬性玩般。
完成上述簡單操作之后银觅,來一張完成的效果圖
menu.xml的代碼:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:icon="@drawable/ic_home_tab_favor"
android:title="菜單1" />
<item
android:icon="@drawable/ic_setting_24dp"
android:title="菜單2標題">
<menu>
<item
android:icon="@drawable/qr_logo"
android:title="菜單2子菜單1" />
<item
android:icon="@drawable/ic_setting_24dp"
android:title="菜單2子菜單2" />
</menu>
</item>
<group android:id="@+id/grp3">
<item
android:icon="@drawable/ic_home_tab_favor"
android:title="菜單3" />
</group>
<group android:id="@+id/grp4">
<item
android:icon="@drawable/ic_home_tab_favor"
android:title="菜單4" />
</group>
</menu>
5.菜單項的點擊效果
創(chuàng)建Selector,然后通過為NavigationView的屬性指定app:itemBackground="@drawable/home_left_drawer_menu_item_bg"
bg_home_left_drawer_menu_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/black" android:state_pressed="true" />
<item android:drawable="@color/white" android:state_pressed="false" />
</selector>
我在selector中設置了很多屬性坏为,想要改變菜單選中之后的背景究驴,但是沒有處理成功,菜單的選中效果是通過菜單圖標和文字來呈現(xiàn)的
6.設置菜單文字選中效果
創(chuàng)建Selector匀伏,然后通過為NavigationView的屬性指定app:itemTextColor="@drawable/home_left_drawer_menu_item_text"
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimaryDark" android:state_checked="true" />
<item android:color="#8a8a8a" android:state_checked="false" />
</selector>
7. 去掉菜單滾動條
當NavigationView的菜單條目很多的時候洒忧,上下滑動右邊就會出現(xiàn)一個灰色滾動條,相對比較難看够颠。
添加android:scrollbars="none"
屬性熙侍,發(fā)現(xiàn)不起作用。因為滾動條本身不是在NavigationView上履磨,而是在NavigationView的一個子View上蛉抓,也就是NavigationMenuView。
myNavView = (NavigationView) this.findViewById(R.id.myNavView);
View menuView = myNavView.getChildAt(0);
if(menuView != null && menuView instanceof NavigationMenuView){
menuView.setVerticalScrollBarEnabled(false);
}