利用Navigation導(dǎo)航組件配合DrawerLayout和NavigationView實(shí)現(xiàn)APP的抽屜導(dǎo)航真的是很方便;但是拿到UI的設(shè)計(jì)圖后發(fā)現(xiàn)抽屜導(dǎo)航的菜單樣式都是自定義的。那默認(rèn)的樣式只是一個(gè) 圖標(biāo) + item標(biāo)題 + 選中背景 這些。那怎么來處理呢?
實(shí)現(xiàn)效果圖:

消息提醒的藍(lán)色小點(diǎn).jpg
利用menuItem 的 actionLayout屬性:
<menu
...
xmlns:app="http://schemas.android.com/apk/res-auto"
...>
<item
android:id="@+id/navigation_notifications"
android:icon="@drawable/ic_notifications"
android:title="@string/title_notifications"
app:actionLayout="@layout/drawer_menu_item"/>
...
</menu>
注意由于這里我們一般用的都是support支持庫或者androidx庫所以這里一定要用 app:actionLayout 而不是android:actionLayout。用android:actionLayout會(huì)沒有任何效果,item的actionView還是null;
Try app:actionLayout="@layout/menu_header" instead of android:actionLayout="@layout/menu_header" if you are using support libraries.
而用app:actionLayout 時(shí)記得在最外層加上命名空間:xmlns:app="http://schemas.android.com/apk/res-auto"
其中 drawer_menu_item.xml 為layout文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical">
<TextView
android:id="@+id/msg"
android:background="@drawable/shape_btn_radius16_clickable"
android:textColor="@android:color/white"
android:gravity="center"
android:layout_width="20dp"
android:layout_height="20dp"/>
</LinearLayout>
在頁面代碼中給item的actionView設(shè)置值
val actionView = binding.navView.menu.findItem(R.id.navigation_notifications).actionView as LinearLayout
actionView.findViewById<TextView>(R.id.msg).text = "9"
上面我通過viewbinding來拿到NavgationView的,當(dāng)然也可以findViewById拿到。