Android应用中菜单(Menu)的位置显示问题

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

1、按下手机上的MENU 按键弹出的菜单显示如下:

Android应用中菜单(Menu)的位置显示问题_第1张图片

2、点击右上角的More按钮显示的菜单如下:

Android应用中菜单(Menu)的位置显示问题_第2张图片

初步分析:
从表面来看,同样的功能菜单,同样的选项,不同是触发方式和显示的位置
单单从表面上来看已经无法知晓此差别的原因了,下面就去分析和研究以下android的browser源码。
分析结果:
通过分析android的browser源码 发现两种菜单虽然显示的菜单项一样,状态一样,但是却用的不是同一种菜单组件,显示在右上角的菜单PopupMenu,显示在底部居中的菜单时OptionsMenu,通过进一步的分析查找发现,android的基本菜单有以下三种:

1、选项菜单和动作条(Options menu and action bar):

        一个Activity中主要的菜单项的集合。在2.3或更低的版本中,用户可以按菜单键来调出选项菜单;在3.0或更高的版本上,可能没有菜单键,所以菜单项是通过动作条来呈现的。
             
2、环境菜单和环境化的动作条(Context menu and contextual action mode);
        当用户在某个元素上长按时的菜单。在3.0或更高本版上,应使用环境化的动作条。
       
3、弹出菜单(Popup menu):        弹出菜单会在调用它的View上显示一个垂直排列的列表。很适合作为动作条的溢出动作。
      

有了以上的背景知识之后,基本上可以知道为什么两个菜单显示的位置不一致,但是为了进一步验证,所以写了一个测试应用,显示效果如下:
1、在android 4.2系统上默认的空白activity,按下手机上的Menu按键,以及右上角的More按钮,菜单都显示如下:
Android应用中菜单(Menu)的位置显示问题_第3张图片

2、通过AndroidManifest配置空白的activity不显示action bar
 
,按下手机上的Menu 键,菜单显示如下:
Android应用中菜单(Menu)的位置显示问题_第4张图片

另:在AndroidManifest里的Activity加上属性

android:uiOptions="splitActionBarWhenNarrow"
后,普通ActionBar将不再显示在标题栏部分,而是显示在屏幕底部,具体效果如下:

Android应用中菜单(Menu)的位置显示问题_第5张图片


结论:

android自带的browser的两种不同位置和触发方式的菜单显示是应用的正常行为,是应用采用了两种不同类型的菜单,因为browser为了兼容性,没有使用新特性action bar,而是自己实现了一个类似action bar的nvscreen控件,控件中使用了PopupMenu,使其定位在More按钮周围,同时还使用了OptionsMenu,因为没有Action bar,所以按下Menu键,会显示菜单在屏幕的底部居中。

更多关于Android的Menu信息,可以参考以下网站: Android开发者官网

你可能感兴趣的:(Android)