您的位置:首页 > 其它

Toolbar 不为人知的助手,ActionMenuView

2016-11-25 09:32 106 查看
原创 技术鸟
2016-11-24 15:10



封面图来自这次长滩岛旅行。第一次出国,感受颇深,绝不是一言两语能够描述的。只有亲自体验过,才能懂得当初女教师辞职信里的那句瞬间爆红的话:“世界那么大,我想去看看。”

不久前,对
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月份第四个星期四),感谢生命中每一个与我相识或不曾相识的人,是你们让我的生命更加丰富多彩,让我不曾后悔走过的每一步路,向着阳光,一点一点稳稳前行!

本文为头条号作者原创。未经授权,不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: