【背景】
想要给Android中的ActionBar中添加那种三个点的选项菜单,之前已经折腾过了,但是失败了,以为新版Android中没法添加呢:
【已解决】android中actionbar中增加setting菜单
但是后来在别的4.1.2的Android手机中,也还是看到了这种的三个点的按钮:
比如微信中就能看到:
墨迹天气中也有:
后来,在折腾:
期间,也还是需要先要弄出来三个点的配置菜单,才方便继续添加支持语音切换的功能。
所以此处还是要继续去想办法,把那三个点的配置菜单弄出来才行。
【折腾过程】
1.搜:
android three dot option menu
参考:
Android ActionBar three dot icon not showing up – Stack Overflow
->
官网:
以及:
去看看那个onPrepareOptionsMenu
以及试试效果,但是看了官网解释,这个貌似不是我所需要关心的。
2.所以还是参考官网
去一点点折腾试试吧。
3.看了官网的解释:
<item> MenuItem , which represents a single item in a menu. This element may contain a nested <menu> element in order to create a submenu. |
想到了:
此处应该可以给Setting加子菜单,这样就可以:
即使没有弄出来三个点的菜单按钮,但是也可以使用现在的Setting按钮代替三个点,然后点击Setting后,出现对应的所需要配置选项子菜单了。
但是先不这么弄。等实在搞不定了三个点的菜单,再用这个办法。
4.关于menu的各种参数详细含义,可以去官网:
Menu Resource | Android Developers
中找到。
其中看到那个
android:showAsAction
的值的其中一种可能是:collapseActionView
看着有点可疑,所以去查查看。
5.参考:
貌似感觉是:
对于加入的N个menu,如果是有空间能放得下,则就显示,否则才可能被放到三个点里面的。
这里:
好像是可以点击这样的collapseActionView之后,再弹出子菜单的。
6.看了“Creating an Options Menu”部分的解释后,基本明白其中的逻辑了:
对于那三个点菜单的话,标准叫法叫做:action overflow button
但是是只在Android 3.0 (API level 11) +才会出现的
低版本的(Android 2.3.x (API level 10) or lower)对应的叫做:overflow menu,效果(不是三个点)而是More那个按钮
不论是三个点还是More按钮,作用都很明显,都表示点击后可以看到更多的按钮菜单
这些更多的菜单,都是由于之前低版本的6个Menu界面放不下了,或者是新版本的actionBar中没位置显示了,才放到这个overflow menu/button中的。
而是否放到overflow中,是通过对应的android:showAsAction
参数来决定的。
对于:
android:showAsAction="ifRoom"
说的就是:
如果actionbar中放不下,就放到overflow中去。
所以,现在去试试其他一些选项的效果:
7.把:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_discard" android:icon="@drawable/error_white" android:orderInCategory="1" android:showAsAction="ifRoom|withText" android:title="@string/discard"/> <item android:id="@+id/menu_send" android:icon="@drawable/forward_white" android:orderInCategory="2" android:showAsAction="ifRoom|withText" android:title="@string/send"/> <item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="ifRoom|withText" android:title="@string/settings"/> </menu>
改为:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_discard" android:icon="@drawable/error_white" android:orderInCategory="1" android:showAsAction="ifRoom|withText" android:title="@string/discard"/> <item android:id="@+id/menu_send" android:icon="@drawable/forward_white" android:orderInCategory="2" android:showAsAction="ifRoom|withText" android:title="@string/send"/> <item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="withText" android:title="@string/settings"/> </menu>
效果是:
结果setting菜单不显示了。。。。
8.再试试:
<item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:title="@string/settings"/>
结果:
也还是不显示。
9.试试:
<item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="collapseActionView" android:title="@string/settings"/>
结果:
也不显示。。。
10.参考:
Action Bar | Android Developers
去学习ActionBar,
对应的3.0+的,应该去看:
ActionBar | Android Developers – API
但是该页面内,竟然没有搜到和overflow有关的内容。。。
11.不过:
Action Bar | Android Developers
中是有overflow相关内容的。
感觉此处之所以不显示三个点的那个菜单,是因为:
当前测试是用的PAD->屏幕很大->ActionBar中空间足够足够显示所有的按钮的->所以没有多余的,放不下的菜单->所以不显示三个点
所以去试试:
换个android的手机->屏幕不够大->ActionBar中不能一次性显示所有的菜单->希望可以看到那个三个点的菜单
结果:
<item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="collapseActionView" android:title="@string/settings"/>
也是不显示。
然后:
<item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="ifRoom|withText" android:title="@string/settings"/>
效果是:
竟然也不显示了。。。
去看看代码,到底咋回事。。。
12.然后确认
android:showAsAction="ifRoom|withText"
在PAD上,的确是可以显示的。
所以再去试试:
android:showAsAction="ifRoom"
在手机上是否能显示:
结果还不能显示。
再去试试,把text都去掉:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_discard" android:icon="@drawable/error_white" android:orderInCategory="1" android:showAsAction="ifRoom" android:title="@string/discard"/> <item android:id="@+id/menu_send" android:icon="@drawable/forward_white" android:orderInCategory="2" android:showAsAction="ifRoom" android:title="@string/send"/> <item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="ifRoom" android:title="@string/settings"/> </menu>
然后是:
在手机上也还是不显示settings。。。
13.也是折腾了半天,最后才有点搞懂具体的逻辑的:
先说现象:
(1)对于三星GT-I9100G:
- Android 4.1.2
- 4.3寸屏
- 有物理MENU键
的手机来说:
屏幕不够大->ActionBar显示空间不是太多->貌似只能显示两个menu->
所以对于此处的代码中,有三个按钮:menu_discard,menu_send,menu_settings
来说,menu_settings始终都是不能直接显示在ActionBar上面
而不论上面的配置参数是否有是ifRoom,是否是ifRoom|withText,
结果都是:
第三个按键,是否都显示不出来,只能靠按物理MENU键,才能看到第三个菜单:
反过来说:
如果你不按MENU键,是始终看不到第三个菜单的
->一直也看不到(三个点的)overflow菜单的
(2)而对于三星GT-P5210的PAD
- Android 4.2.2
- 也有物理MENU菜单
- 10.1寸屏
只显示图标不显示文字:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_discard" android:icon="@drawable/error_white" android:orderInCategory="1" android:showAsAction="ifRoom" android:title="@string/discard"/> <item android:id="@+id/menu_send" android:icon="@drawable/forward_white" android:orderInCategory="2" android:showAsAction="ifRoom" android:title="@string/send"/> <item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="ifRoom" android:title="@string/settings"/> </menu>
的效果:
不仅显示图标也显示文字:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_discard" android:icon="@drawable/error_white" android:orderInCategory="1" android:showAsAction="ifRoom|withText" android:title="@string/discard"/> <item android:id="@+id/menu_send" android:icon="@drawable/forward_white" android:orderInCategory="2" android:showAsAction="ifRoom|withText" android:title="@string/send"/> <item android:id="@+id/menu_settings" android:icon="@drawable/settings" android:orderInCategory="3" android:showAsAction="ifRoom|withText" android:title="@string/settings"/> </menu>
的效果:
也是看不到三个点的overflow菜单的。
【总结】
后续折腾,以及总结,详见: