问题的产生:
在bugzilla中发现测试人员提出的一个bug,经过仔细阅读测试人员给出的信息,发现是关于应用中MENU按键弹出菜单和点击More弹出菜单的位置显示不一致的问题,具体问题如下:
1、按下手机上的MENU按键弹出的菜单显示如下:

2、点击右上角的More按钮显示的菜单如下:
初步分析:
从表面来看,同样的功能菜单,同样的选项,不同是触发方式和显示的位置。
单单从表面上来看已经无法知晓此差别的原因了,下面就去分析和研究以下android的browser源码。
分析结果:
通过分析android的browser源码发现两种菜单虽然显示的菜单项一样,状态一样,但是却用的不是同一种菜单组件,显示在右上角的菜单是PopupMenu,显示在底部居中的菜单时OptionsMenu,通过进一步的分析查找发现,android的基本菜单有以下三种:
1、选项菜单和动作条(Options menu and action bar):
一个Activity中主要的菜单项的集合。在2.3或更低的版本中,用户可以按菜单键来调出选项菜单;在3.0或更高的版本上,可能没有菜单键,所以菜单项是通过动作条来呈现的。![]()
Android应用中菜单(Menu)的位置显示问题 ![]()
Android应用中菜单(Menu)的位置显示问题
2、环境菜单和环境化的动作条(Context menu and contextual action mode);
当用户在某个元素上长按时的菜单。在3.0或更高本版上,应使用环境化的动作条。3、弹出菜单(Popup menu): 弹出菜单会在调用它的View上显示一个垂直排列的列表。很适合作为动作条的溢出动作。![]()
Android应用中菜单(Menu)的位置显示问题
有了以上的背景知识之后,基本上可以知道为什么两个菜单显示的位置不一致,但是为了进一步验证,所以写了一个测试应用,显示效果如下:
1、在android 4.2系统上默认的空白activity,按下手机上的Menu按键,以及右上角的More按钮,菜单都显示如下:
2、通过AndroidManifest配置空白的activity不显示action bar
,按下手机上的Menu键,菜单显示如下:
另:在AndroidManifest里的Activity加上属性
后,普通ActionBar将不再显示在标题栏部分,而是显示在屏幕底部,具体效果如下:
结论:
android自带的browser的两种不同位置和触发方式的菜单显示是应用的正常行为,是应用采用了两种不同类型的菜单,因为browser为了兼容性,没有使用新特性action
bar,而是自己实现了一个类似action bar的nvscreen控件,控件中使用了PopupMenu,使其定位在More按钮周围,同时还使用了OptionsMenu,因为没有Action
bar,所以按下Menu键,会显示菜单在屏幕的底部居中。