本章要介紹的應用控制的最後兩個方面:菜單欄和活動欄(Action Bar)。例6-15說明了如何通過覆蓋兩個Activity方法實現簡單的菜單欄。
例6-15:實現菜單欄
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater.inflate(R.menu.simple_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId) { case R.id.menu_clear: dotModel.clearDots; return true; default: ; return super.onOptionsItemSelected(item); } }
當把這段代碼添加到TouchMe類時,單擊設備的Menu按鍵,應用會彈出一個菜單,如圖6-7所示。
單擊Enter按鍵,或者再次單擊菜單項,都會清除該DotView。
在Android蜂巢(Android 3.0)系統中,Google廢棄了菜單按鈕,而選擇Action選項卡,在第9章將詳細描述。但是,前面給出的代碼是可以向前兼容的。
Google希望開發者能夠完全拋棄菜單的概念,鼓勵開發者創建可以直接操作對象的用戶界面。Action選項卡提供一致的接口,可處理適用於不同屏幕尺寸的全局行為。
圖6-7:一個簡單的菜單
當Dots應用更新成目標Ice Cream Sandwich應用(在應用的manifest文件中,targetSdk Version=「14」)時,而且在蜂巢版本之後的Android系統中運行,同樣的代碼會在活動欄中生成action按鈕。
該按鈕即圖6-8中顯示的最右上方的垃圾回收站圖標,是該應用的「Clear」action按鈕。在之前的Android版本中,按下「Clear」按鈕會清空顯示的DotView。
有趣的是,如果你在蜂巢之前的Android版本上運行該應用,你會發現雖然添加的菜單項在絕大多數情況下能夠正常運行,但是當光標定位在DotView時就不可用。你能猜到原因嗎?
如果你猜到是因為DotView中安裝了OnKeyListener,那麼恭喜你,猜對了!在例6-16中,當單擊菜單鍵後,監聽器會直接返回true,而不會執行菜單鍵事件。這種方式攔截了對標準的菜單鍵按鍵View的處理。為了使菜單鍵可以正常工作,需要重新實現OnKeyListener。
圖6-8:action按鈕
例6-16:改進後的按鍵處理
switch (keyCode) { case KeyEvent.KEYCODE_MENU: return false; // ...
Android UI框架還支持上下文菜單,可以通過Context Menu類實現該功能。當長按支持該功能的widget按鍵時,會顯示該菜單。添加上下文菜單到應用中的代碼和前面給出的顯示選項菜單的代碼幾乎是完全一樣的,只是方法名不同而已,分別是onCreateContextMenu和onContextItemSelected。此外,添加上下文菜單到應用中還需要執行一個調用。要支持上下文菜單,必須在View類上調用setOnCreateContextMenuListener方法,為Widget分配View.OnCreateContextMenuListener接口。幸運的是,Activity類實現了View.OnCreateContextMenuListener接口。setOnCreateContextMenuListener方法的常見的調用方式如例6-17所示。
例6-17:安裝ContextMenuListener
findViewById(R.id.ctxtMenuView).setOnCreateContextMenuListener(this);
只需要重載上下文菜單監聽器提供的默認的、空Activity實現就可以為應用生成上下文菜單。