android menu分割线,给 NavigationView 的Menu的分割线 设置高度和颜色
最近遇到了一個問題,是給DrawerLayout的NavigationView的導航添加分割線,項目中的左側導航欄之前的實現(xiàn)是用系統(tǒng)Menu的方式來實現(xiàn)的,需求要給導航添加分割線,并且自定義顏色和高度,查看文檔雖然能通過給menu通過group加id的方式添加分割線 ,代碼如下:
android:id="@+id/group1"
android:checkableBehavior="single">
android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
android:id="@+id/group2"
android:checkableBehavior="single">
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow" />
android:id="@+id/nav_manage"
android:icon="@drawable/ic_menu_manage"
android:title="Tools" />
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share" />
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send" />
顯示如下圖:
Paste_Image.png
但是設計不喜歡這個線條啊,很粗啊,顏色不好看啊!好吧改!不過在NavigationView上沒有找到可以訂制的屬性!然后查看NavigationView的源代碼,發(fā)現(xiàn) 左側欄的布局是通過NavigationMenuPresenter這個類來實現(xiàn)的,通過查看NavigationMenuPresenter的代碼發(fā)現(xiàn)了 design_navigation_item_separator.xml 這個布局:
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="1dp"
android:background="?android:attr/listDivider"/>
發(fā)現(xiàn)顏色是可以通過在主題里通過listDivider屬性來配置,但是高度固定1dp了,View 沒有ID說明就沒有考慮這個高度,怎么改?
看看NavigationMenuPresenter的具體實現(xiàn)吧,左側欄整個布局是通過RecyclerView 來實現(xiàn)的,通過不同的 View 的 TYPE 類型來加載不同的布局!那么是不是可以從 RecyclerView 的 addOnChildAttachStateChangeListener 方法入手?
實踐出真知!
我們可以先通過反射得到RecyclerView:
Field fieldByPressenter = navigationView.getClass().getDeclaredField("mPresenter");
fieldByPressenter.setAccessible(true);
NavigationMenuPresenter menuPresenter = (NavigationMenuPresenter) fieldByPressenter.get(navigationView);
Field fieldByMenuView = menuPresenter.getClass().getDeclaredField("mMenuView");
fieldByMenuView.setAccessible(true);
final NavigationMenuView mMenuView = (NavigationMenuView) fieldByMenuView.get(menuPresenter);
mMenuView就是RecyclerView,剩下的是給其注冊addOnChildAttachStateChangeListener監(jiān)聽,每加載一個view 就獲取它的ViewHolder,通過判斷ViewHolder是否是SeparatorViewHolder(是分割線的獨有ViewHolder)的實例,來確定分割線View,然后想怎么操作就怎么操作!完整代碼如下:
public static void setNavigationMenuLineStyle(NavigationView navigationView, @ColorInt final int color, final int height) {
try {
Field fieldByPressenter = navigationView.getClass().getDeclaredField("mPresenter");
fieldByPressenter.setAccessible(true);
NavigationMenuPresenter menuPresenter = (NavigationMenuPresenter) fieldByPressenter.get(navigationView);
Field fieldByMenuView = menuPresenter.getClass().getDeclaredField("mMenuView");
fieldByMenuView.setAccessible(true);
final NavigationMenuView mMenuView = (NavigationMenuView) fieldByMenuView.get(menuPresenter);
mMenuView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
RecyclerView.ViewHolder viewHolder = mMenuView.getChildViewHolder(view);
if (viewHolder != null && "SeparatorViewHolder".equals(viewHolder.getClass().getSimpleName()) && viewHolder.itemView != null) {
if (viewHolder.itemView instanceof FrameLayout) {
FrameLayout frameLayout = (FrameLayout) viewHolder.itemView;
View line = frameLayout.getChildAt(0);
line.setBackgroundColor(color);
line.getLayoutParams().height = height;
line.setLayoutParams(line.getLayoutParams());
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
效果圖如下:
Paste_Image.png
再來個更直觀的圖:
Paste_Image.png
總結
以上是生活随笔為你收集整理的android menu分割线,给 NavigationView 的Menu的分割线 设置高度和颜色的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 请求参数打印,andro
- 下一篇: android 7.0 更新apk,An