Toolbar 不为人知的好助手,ActionMenuView

3,856 阅读2分钟

不久前,对 Toolbar 控件的使用写了一篇总结性的文章:Android Toolbar,你想知道的都在这里了,本文应该算是一个补充完善吧,将 ActionMenuView 的使用加入其中。

平时我们在使用 Toolbar 的时候,很少会用到 ActionMenuView 这个控件。虽然用起来很简单,但是很多伙伴并不知道他的存在,因为他的使用场景确实少见,我所能列举的也只有两个:

第一个,大家知道,Toolbar 默认将 Menu 内容摆放在右边,空间不足时溢出到 OverFlow 窗口中。比如现在有个需求,要将 Menu 的位置摆放在左边,也就是与 Title 相邻的右边,那该如何控制呢?

第二个,动态添加或者删除 Menu Item ,又该如何实现呢?当然,你也能使用 visible 属性来控制,但很显然,这不是一个很好的解决方案。

以上两个应用场景比较特殊,但也不是没有出现的可能。如果你知道 ActionMenuView 的存在的话,处理起来就很得心应手。

ActionMenuView 是将原本位于 Toolbar 或者 ActionBar 中的 Menu 内容移到自己的名下,以 ViewGroup 的姿态将一些列的 Menu Item 囊括其中,再将自己搁置于 Toolbar 容器中,这样,更方便于管理和呈现 Menu 内容。所以,原本孤立的 Toolbar 控件,就有了一个 Child,代码如下:


再在 Activity 文件中,将 Menu 资源文件加载到使用 findViewById() 方法获取到的 ActionMenuView 对象中:


至于 Menu Item 的点击事件方法 onOptionsItemSelected 无需改动,只要将 ActionMenuView 对象的点击事件设置转移即可:


还可以利用 getMenu() 方法获取到 Menu 对象,动态添加或删除 Menu Item,甚至加载另外一个 Menu 资源文件,比如:

mHomeAmv.getMenu().clear(); getMenuInflater().inflate(R.menu.search, mSearchAmv.getMenu());

现在有这样一个需求,设计图如下 ( 图片来源:stack overflow ) :


就可以利用 ActionMenuView 控制 Menu Item 的位置了。当然,这里面还需要另外几个知识点,顺便补充说明一下。

第一,Menu Item 间距问题。Item 默认的宽度是56dp ,可以利用 style 中的属性修改,并将样式设置给 Activity 主题即可,比如:


第二,Menu Item 图标高亮问题。当然,你可以使用两套图标,在点击时修改设置。但使用一套图标也能做到,还能减少 APK 文件大小,比如:


介绍完毕,这些知识点已补充至博客 Toolbar 一文中,想了解更多工具栏知识,可以点击「阅读原文」查看博文。另外,今天是「感恩节」(每年11月份第四个星期四),感谢生命中每一个与我相识或不曾相识的人,是你们让我的生命更加丰富多彩,让我不曾后悔走过的每一步路,向着阳光,一点一点稳稳前行!