天天看點

Android應用中菜單(Menu)的位置顯示問題

問題的産生:

在bugzilla中發現測試人員提出的一個bug,經過仔細閱讀測試人員給出的資訊,發現是關于應用中MENU按鍵彈出菜單和點選More彈出菜單的位置顯示不一緻的問題,具體問題如下:

1、按下手機上的MENU按鍵彈出的菜單顯示如下:

Android應用中菜單(Menu)的位置顯示問題

2、點選右上角的More按鈕顯示的菜單如下:

Android應用中菜單(Menu)的位置顯示問題

初步分析:

從表面來看,同樣的功能菜單,同樣的選項,不同是觸發方式和顯示的位置。

單單從表面上來看已經無法知曉此差别的原因了,下面就去分析和研究以下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或更高本版上,應使用環境化的動作條。
Android應用中菜單(Menu)的位置顯示問題
3、彈出菜單(Popup menu):        彈出菜單會在調用它的View上顯示一個垂直排列的清單。很适合作為動作條的溢出動作。
Android應用中菜單(Menu)的位置顯示問題

有了以上的背景知識之後,基本上可以知道為什麼兩個菜單顯示的位置不一緻,但是為了進一步驗證,是以寫了一個測試應用,顯示效果如下:

1、在android 4.2系統上預設的空白activity,按下手機上的Menu按鍵,以及右上角的More按鈕,菜單都顯示如下:

Android應用中菜單(Menu)的位置顯示問題

2、通過AndroidManifest配置空白的activity不顯示action bar

,按下手機上的Menu鍵,菜單顯示如下:

Android應用中菜單(Menu)的位置顯示問題

另:在AndroidManifest裡的Activity加上屬性

後,普通ActionBar将不再顯示在标題欄部分,而是顯示在螢幕底部,具體效果如下:

Android應用中菜單(Menu)的位置顯示問題

結論:

android自帶的browser的兩種不同位置和觸發方式的菜單顯示是應用的正常行為,是應用采用了兩種不同類型的菜單,因為browser為了相容性,沒有使用新特性action

bar,而是自己實作了一個類似action bar的nvscreen控件,控件中使用了PopupMenu,使其定位在More按鈕周圍,同時還使用了OptionsMenu,因為沒有Action

bar,是以按下Menu鍵,會顯示菜單在螢幕的底部居中。

繼續閱讀