给 NavigationView 的Menu的分割线 设置高度和颜色
来源:互联网 发布:数据挖掘的技术基础是? 编辑:程序博客网 时间:2024/06/06 04:05
最近遇到了一个问题,是给DrawerLayout的NavigationView的导航添加分割线,项目中的左侧导航栏之前的实现是用系统Menu的方式来实现的,需求要给导航添加分割线,并且自定义颜色和高度,查看文档虽然能通过给menu通过group加id的方式添加分割线 ,代码如下:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/group1" android:checkableBehavior="single"> <item android:id="@+id/nav_camera" android:icon="@drawable/ic_menu_camera" android:title="Import" /> <item android:id="@+id/nav_gallery" android:icon="@drawable/ic_menu_gallery" android:title="Gallery" /> </group> <group android:id="@+id/group2" android:checkableBehavior="single"> <item android:id="@+id/nav_slideshow" android:icon="@drawable/ic_menu_slideshow" android:title="Slideshow" /> <item android:id="@+id/nav_manage" android:icon="@drawable/ic_menu_manage" android:title="Tools" /> </group> <group android:id="@+id/group3"> <item android:id="@+id/nav_share" android:icon="@drawable/ic_menu_share" android:title="Share" /> <item android:id="@+id/nav_send" android:icon="@drawable/ic_menu_send" android:title="Send" /> </group></menu>
显示如下图:
但是设计不喜欢这个线条啊,很粗啊,颜色不好看啊!好吧改!不过在NavigationView上没有找到可以订制的属性!然后查看NavigationView的源代码,发现 左侧栏的布局是通过NavigationMenuPresenter这个类来实现的,通过查看NavigationMenuPresenter的代码发现了 design_navigation_item_separator.xml 这个布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="?android:attr/listDivider"/></FrameLayout>
发现颜色是可以通过在主题里通过listDivider属性来配置,但是高度固定1dp了,View 没有ID说明就没有考虑这个高度,怎么改?
看看NavigationMenuPresenter的具体实现吧,左侧栏整个布局是通过RecyclerView 来实现的,通过不同的 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监听,每加载一个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(); } }
效果图如下:
再来个更直观的图:
- 给 NavigationView 的Menu的分割线 设置高度和颜色
- 给 NavigationView 的Menu的分割线 设置高度和颜色
- 去掉listview的分割线和分割线的颜色,高度的设置
- 设置ListView的分割线及分割线的高度
- ListView设置分割线高度和 颜色 ~问题~
- 设置cell分割线的高度
- 设置TableView分割线的风格和颜色
- 设置UITableView分割线的颜色和位置
- 设置listview分割线的颜色和宽度
- ExpandableListView设置分割线的颜色
- ListView的item高度问题及分割线的颜色设置
- UITableViewCell分割线(样式,宽度·高度调整,颜色等的设置)
- Android listview分割线颜色和高度
- UITableViewCell的选中时的颜色设置和分割线颜色设置
- UITableView不弹动,分割线颜色,cell的高度
- 自定义listview分割线的颜色和高度(兼容任何版本)
- Android小知识——listView的分割线高度和颜色
- iOS小技巧-UITableView去除底部多余的分割线方法以及设置分割线风格和颜色
- 浅析 JavaScript 中的闭包
- Java的数组操作
- linux常用命令集合
- Java面向对象笔记(九)多态
- 一种周期比较短的排序算法
- 给 NavigationView 的Menu的分割线 设置高度和颜色
- 关于处理微信网页缓存问题
- 《乐跑宝典》读书笔记
- Java面向对象笔记(十)函数重载
- JavaScript 深入之执行上下文
- caffe windows + vs2015安装
- Java面向对象笔记(十一)重写、覆盖
- css样式表
- React Native 中组件的生命周期