博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Toolbar 不为人知的助手,ActionMenuView
阅读量:4291 次
发布时间:2019-05-27

本文共 1461 字,大约阅读时间需要 4 分钟。

Toolbar 不为人知的助手,ActionMenuView

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

不久前,对 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,代码如下:

Toolbar 不为人知的助手,ActionMenuView

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

Toolbar 不为人知的助手,ActionMenuView

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

Toolbar 不为人知的助手,ActionMenuView

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

mHomeAmv.getMenu().clear();

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

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

Toolbar 不为人知的助手,ActionMenuView

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

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

Toolbar 不为人知的助手,ActionMenuView

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

Toolbar 不为人知的助手,ActionMenuView

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

本文为头条号作者原创。未经授权,不得转载。

你可能感兴趣的文章
Linux 软连接与硬链接
查看>>
视音频数据处理入门:H.264视频码流解析
查看>>
视音频数据处理入门:AAC音频码流解析
查看>>
视音频数据处理入门:UDP-RTP协议解析
查看>>
视音频数据处理入门:FLV封装格式解析
查看>>
最简单的基于FFMPEG的封装格式转换器(无编解码)
查看>>
base64 编码原理
查看>>
单链表是否有环的问题
查看>>
判断两个链表是否相交并找出交点
查看>>
归并排序
查看>>
STL常见问题
查看>>
time_wait和close_wait状态
查看>>
STL中vector、list、deque和map的区别
查看>>
Linux下多线程查看工具(pstree、ps、pstack)
查看>>
PID PPID LWP NLWP
查看>>
查看线程CPU占用情况
查看>>
查看个线程的CPU 内存占用
查看>>
svn中设置文件夹链接
查看>>
find ./ -name "*.cgi" |xargs -i cp "{}" ./cgi-bin/
查看>>
svn st | awk '{if ( $1 == "?") { print $2}}' | xargs svn add
查看>>