管理 MaterialDrawer 的条目颜色

MaterialDrawer 是 Android 下用户不少的一个侧滑菜单类库,优点是为常见场景进行了相对周全的考虑和支持,缺点是在设计上有点过犹不及的意味。

三太爷在手上业余维护的一个项目,里面用到了它,所以在进行某些改动时,也不得不面对它,思考如何下手。上一次的需求在于,1. 要向 AccountHeader 中增加新的控件,2. 出于充分利用空间以及原有控件的某些功能的目的,希望将其原始 AccountHeader 中的预留的几个非主用户的头像控件复用起来;行为控制反倒好办,难点在于它自有风格是图片自动裁剪为圆形,要把这个行为屏蔽掉,以正确显示设置的图标,3. 要对复用过的头像控件增加 badge 功能。

对于需求 1,经过考察后发现可以算作是有官方支持的途径的,解决。需求 2,最后在合适的地方以轻量级的反射操作达到目的,解决。需求 3,由于 badge 的加入会干扰现有布局,以及在用户登入登出时头像控件的显隐操作,所以稍微费了点周折,也解决了。

后来发现,App 本身有个用户可以定制主题色调的功能,设置以后,侧滑菜单的默认设置有时候就会显得不很协调。翻看了一下 MaterialDrawer 的接口,似乎没有找到在程序运行过程中动态改变颜色的函数。在其项目的 issues 里,有人提问如何改变选定条目的高亮色,作者提供的思路一直驻留在更改 style/theme 资源文件的方向上,令人烦郁。问了几个专业 Android 开发的小兄弟,提供的信息也不能令人满意。

一开始的构思是,找到作用与 Drawer 的一个方法,使之在调用时不但将现有条目全部应用为所设置的颜色,还会将此值记下,作用于后续可能新增/重新创建的条目上。后来经过对源代码的考察,以及跟小伙伴们的探讨,决定仅增加对现有条目的影响,但并不希望仅提供作用于单一条目的方法,而使调用者自行去遍历;但同时,保留仅仅作用于单一条目的能力是必要的。于是跟峰峰小起锦标赛,看谁先写出来,然后再讨论优劣。

当晚(前天,13 号),花了一个多两个来钟头来写,后来索性要把它写完整为对条目内各个部分/状态颜色的支持,还做了一次重构,以达到代码复用的最佳状态。MaterialDrawer 中对颜色有所控制的条目类为 BaseDrawerItem,因此本工具类的主要作用对象也就是针对它了。代码如下。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注