最近遇到了一个问题,是给DrawerLayout的NavigationView的导航添加分割线,项目中的左侧导航栏之前的实现是用系统Menu的方式来实现的,需求要给导航添加分割线,并且自定义颜色和高度,查看文档虽然能通过给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的源代码,发现 左侧栏的布局是通过NavigationMenuPresenter这个类来实现的,通过查看NavigationMenuPresenter的代码发现了 design_navigation_item_separator.xml 这个布局:

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:layout_height="1dp"

android:background="?android:attr/listDivider"/>

发现颜色是可以通过在主题里通过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();

}

}

效果图如下:

Paste_Image.png

再来个更直观的图:

Paste_Image.png

android menu分割线,给 NavigationView 的Menu的分割线 设置高度和颜色相关推荐

  1. android控件向内弧度_android给View设置边框 填充颜色 弧度

    Android开发技巧--设置系统状态栏颜色 开门见山,先来三张效果图: 然后我们再来讲如何实现以及如何快速地实现. 如何实现 实现设置系统状态栏颜色需要至少在Android 4.4.2(API 19 ...

  2. 系出名门Android(2) - 布局(Layout)和菜单(Menu)

    2019独角兽企业重金招聘Python工程师标准>>> 系出名门Android(2) - 布局(Layout)和菜单(Menu) 作者:webabcd 介绍 在 Android 中各 ...

  3. Android笔记 简单demo Spinner AutoCompleteTextView Menu

    demo1 spinner 1布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...

  4. android椭圆转盘菜单,Android CircleMenu:旋转转盘选择Menu

     Android CircleMenu:旋转转盘选择Menu Android CircleMenu是一个可以自由旋转类似转盘样式的选择Menu.其运行效果如动态图所示: 这在中国建设银行官方的AP ...

  5. Android 的上下文菜单: Context Menu

    本文转载自: https://www.cnblogs.com/hibraincol/archive/2010/09/30/1839014.html 作者:hibraincol 转载请注明该声明. 概述 ...

  6. android 判断手机是否有物理menu键

    android 判断手机是否有物理menu键 ViewConfiguration.get(getContext()).hasPermanentMenuKey();

  7. Android ToolBar设定为ifRoom的menu不显示图标的问题

    出现问题的情况是在开启混淆后,被收纳的menu的图标都不显示 网上大多数都是设定反射来显示, /*** 解决不显示menu icon的问题* @param menu:Menu对象* @param fl ...

  8. vue、Menu 导航菜单、Menu属性事件、vue Menu 全部导航菜单、vue Menu 全部属性事件

    vue.Menu 导航菜单.Menu属性事件.vue Menu 全部导航菜单.vue Menu 全部属性事件 设计规则 何时使用 代码演示 顶部导航 内嵌菜单 缩起内嵌菜单 只展开当前父级菜单 垂直菜 ...

  9. android调小边框距离,RecyclerView Item 的分割线 距边框距离问题总结

    哈, 首先  今天Design 提了一个需求,废话少说~~! 上图android 分割线 在中间显示,距离左边 边距是66px 右边依然是66px.ios 刚开始接到这个需求,感受还阔以,挺简单的,可 ...

最新文章

  1. np.eye解释较好的
  2. 开发常见错误解决(7)连接到SQL Server 2005出错
  3. 提交代码前问自己七个问题!
  4. C#中获取当前时间字符串给文件命名防止重复
  5. opencv-python教程学习系列2-读取/显示/保存图像
  6. boost创建线程池_Java并发 之 线程池系列 (1) 让多线程不再坑爹的线程池
  7. 1.6 动态数据抓取 -- PyQuery详解
  8. 使用Apriori进行关联分析(二)
  9. ctype函数_PHP ctype_xdigit()函数与示例
  10. 三星5G手机全球销量200万台:年底将翻番
  11. 大智慧 软件 开发语言_中科闻歌中标深圳税务局智慧税务中台软件开发服务项目...
  12. 页面JS实现按钮点击增加输入框
  13. Linux 文件系统(二)---执行过程及结构间的关系
  14. 计算机硬盘换,无需重新安装系统即可更换硬盘的方法(计算机无需重新安装系统即可更换硬盘)...
  15. 批量生成10位数手机号,用作账号注册
  16. 搜狗站长工具:索引量与收录量的解释,它等同于site的收录吗?
  17. 磅、号、ppi、dpi、字号和分辨率关系
  18. 双系统装完只能u盘启动_怎样用u盘安装双系统呢?
  19. python飞机大战概要设计_飞机大战展示.ppt
  20. 【智能优化算法】基于分段权重和变异反向学习的蝴蝶优化算法求解单目标优化问题附matlab代码

热门文章

  1. Easyx项目小合集
  2. python无法安装tensorflow_python – 无法安装Tensorflow Mac
  3. Spring中毒太深,离开Spring我居然连最基本的接口都不会写了
  4. 我服了!一些比较恶心的代码片段
  5. Android调用系统软件打开文件(包括apk文件)
  6. c++ map中用char数组_C开发实战-指针和字符串
  7. (Mybatis)使用注解开发
  8. 进腾讯了!(实习面经分享)
  9. Java中同时输入字符串和int类型出错的处理方式
  10. 使用jsoup解析html