Android基本之Menu菜單

菜單特性Menu Features

 

 http://blog.csdn.net/iefreer/archive/2009/09/21/4577124.aspx

 

 


 
創建菜單 Creating Menus
 


菜單是任何應用程序的一個重要部分,提供了透露應用程序功能和設置的通用接口。Android爲開發者提供了一個簡單的編程接口來實現各種條件下的標準化應用程序菜單。
 
Android提供了三種基礎菜單類型:
 
選項菜單Options Menu

 

這是一個活動的主菜單。通過按下設備菜單鍵來顯示它。選項菜單包含兩組菜單項:

圖標菜單Icon Menu

這個是當用戶按下菜單鍵時最初出現屏幕下方的item集合。它支持最多6個菜單項。只有這些菜單支持圖標而且這些菜單並不支持checkboxes或者radio buttons。
 
擴展菜單Expanded Menu

這是通過按“更多”菜單顯現出來的一個豎向的項目列表。它僅當圖標菜單過多時存在而且是由6個以及其它選項菜單組成。

 

上下文菜單Context Menu

這是一個浮動菜單列表,通常在你長時間按在一個視圖上時出現(比如一個列表項)
 
子菜單Submenu

這是一個浮動菜單列表,通過在選項菜單或上下文菜單選擇菜單項顯露出來。不支持嵌套子菜單。
 

 

選項菜單Options Menu
 


這個選項菜單通過按設備菜單鍵打開。打開後,出現圖標菜單,可包含6個菜單項。如果添加多於6個菜單項,多出的部分將通過“更多”菜單項在擴展菜單中顯示。擴展菜單項在多於6個菜單項時自動添加。
 
選項菜單應該包含應用程序的基本功能以及任何必要的瀏覽項(例如,返回桌面或應用程序設置)。你還可以通過增加子菜單Submenus來組織主題和包含額外的菜單功能。
 
當菜單第一次被打開時,系統會調用活動onCreateOptionsMenu()回調函數。重寫該方法並生成傳遞給你的這個菜單對象。你可以通過擴充定義在XML文件中的一個菜單資源或者通過爲你想要的每一個菜單項調用add()方法生成這個菜單。這個方法增加一個菜單項MenuItem,並返回新創建的對象。你可以用返回的MenuItem來設置附加屬性如圖標,快捷鍵,意圖以及這個菜單項的其它設置。
 
有多個add()方法。通常,你會使用接受一個itemId參數的那個。這是一個唯一的整數,允許你在回調函數中識別這個item。
 
當一個菜單項從選項菜單中被選擇時,你會接收到一個onOptionsItemSelected()回調。這個回調傳給你選中的MenuItem。你可以通過請求itemId:getItemId()來識別它,這將返回add()方法分配的整數。一旦你識別了這個菜單項,就可以採取合適的動作。
 
下面是一個活動裏的例子,其中我們創建了一個選項菜單並處理菜單項的選擇:

 

 

這個add()方法有四個參數:groupId, itemId, order, 和 title。groupId 允許你關聯這個菜單到一個菜單組中(更多參見下面的菜單組Menu groups)-這個例中,我們忽略掉它。itemId是用來識別菜單項的唯一的整數,在回調函數中使用。order 允許我們定義菜單的顯示順序-缺省情況下,它們以添加時的順序排列。title當然是菜單的名字(可以是一個字符串資源,爲了本地化更加方便,建議你使用資源)。
 

提示: 如果你有一些可以以一個標題歸類的菜單項,考慮以子菜單Submenu的方式組織它們。
 
增加圖標Adding icons
 
圖標也可以通過setIcon()函數被添加到菜單項中。
 
menu.add(0, MENU_QUIT, 0, "Quit").setIcon(R.drawable.menu_quit_icon);

 

修改菜單Modifying the menu


 
如果有些時候你想在選項菜單被打開的時候re-write它,可以override onPrepareOptionsMenu()方法,該方法在每一次菜單被打開的時候調用。它將傳遞給你菜單對象,就像回調一樣。這對於根據應用程序狀態調整菜單選項很有用。
 

注意: 當改變菜單項時,根據當前選擇的item來這樣做是一個不好的行爲。記住,在觸摸模式中,將不會有一個選擇或聚焦的item。相反,當你想基於UI中的某個特定item來提供功能時,你應該使用一個Context Menu 來完成這種行爲。
 

上下文菜單Context Menu

 
Android的上下文菜單在概念上和PC軟件的右鍵菜單類似。當一個視圖註冊到一個上下文菜單時,執行一個在該對象上的“長按”(按住不動差不多兩秒鐘)動作,將出現一個提供相關功能的浮動菜單。上下文菜單可以被註冊到任何視圖對象中,不過,最常見的是用於列表視圖ListView的item,在按中列表項時,會轉換其背景色而提示將呈現上下文菜單。 (電話聯繫人列表提供了關於這個特性的一個很好的例子)。
 

注意:上下文菜單項不支持圖標或快捷鍵。
 
爲了創建一個上下文菜單,你必須重寫這個活動的上下文菜單回調函數:onCreateContextMenu() 和onContextItemSelected()。在回調函數onCreateContextMenu()裏,你可以通過使用一個add()方法來添加菜單項,或者通過擴充一個定義在XML中的菜單資源。然後,通過registerForContextMenu()爲這個視圖註冊一個上下文菜單ContextMenu.
 
比如,下面的代碼可以被用到Notepad應用程序中來爲列表中的每一個註釋添加一個上下文菜單:

 

 

效果如下:

 

 

在onCreateContextMenu()中,除了給出將添加MenuItems的ContextMenu外,還需要給定選中的視圖和一個上下文菜單信息ContextMenuInfo對象,該對象提供了選中對象的附加信息。在本例中,onCreateContextMenu()沒做什麼特別的事-只是添加了一些菜單項。在onContextItemSelected() 回調函數中,我們從MenuItem中請求AdapterContextMenuInfo,該對象提供當前選中項的信息。我們從中所要的只是這個選中項的列表ID,所以無論編輯還是刪除一個註釋,我們通過這個對象的AdapterContextMenuInfo.info字段來找到該ID。這個ID被傳遞給editNote() 和deleteNote()方法來執行相應的動作。
 
現在,要爲一個列表視圖中的所有項註冊上下文菜單,我們可以傳遞整個的列表視圖對象給registerForContextMenu(View) 方法:
 
registerForContextMenu(getListView());
記住,你可以傳遞任何視圖對象來註冊一個上下文菜單。這裏,getListView()返回這個被用於Notepad應用程序的列表活動ListActivity中的列表視圖對象。這樣,這個列表中的任何item都被註冊到這個上下文菜單。

 


子菜單Submenus

 
一個子菜單可以被添加進任何菜單中,但不能加入另外的子菜單中。當你的應用程序有很多功能可以按主題組織的時候,這將非常有用,就好比PC應用程序的菜單欄(文件,編輯,視圖,等)。
 
子菜單通過addSubMenu()加入到已有的菜單中而創建。該函數會返回一個子菜單SubMenu對象(菜單Menu的一個擴展)。然後你可以通過調用add()方法給這個菜單添加其他項,例如:
 

 

效果如下:

 

子菜單中選擇項的回調動作將由父菜單的回調方法處理。比如上面的例子,子菜單中的選擇將由onOptionsItemSelected() 回調處理。
 
你也可以在XML中定義父菜單時增加子菜單。
 

在XML裏定義菜單Define Menus in XML


 
就像Android用戶界面佈局一樣,你可以在XML文件中定義菜單,然後在你菜單的onCreate...()回調函數中擴充它們。這使得你的應用程序代碼簡潔而且把更多的界面設計分離到XML文件中,這更容易形象化。
 
首先,在你的工程res/的目錄下創建一個新的目錄叫menu。你所有定義應用程序菜單的XML文件都應該放在這裏。
 
在一個菜單XML佈局中,有三個合法的元素:<menu>,<group>和<item>。item 和group 必須是菜單的子元素,而item 元素還可以是group的子元素,並且另外一個菜單元素可以是一個item 的子元素(來創建一個子菜單)。當然,任何文件的根元素必須是一個 menu 元素。
 
作爲一個例子,我們將定義和在上面的選項菜單Options Menu章節中所創建的相同的菜單,我們首先在目錄res/menu/裏創建一個名爲options_menu.xml 的文件。
  

然後,在onCreateOptionsMenu()方法裏,我們通過MenuInflater.inflate()方法擴充這個資源:
 

 

getMenuInflater() 方法返回我們活動上下文的MenuInflater。然後我們調用inflate(),傳遞給它一個指向我們菜單資源的指針以及回調給出的菜單對象。
 
儘管和在onCreateOptionsMenu()創建菜單比較起來,上面的例子看起來做了更多的事情,但是如果處理更多的菜單項,這將省掉很多麻煩並讓你的代碼簡潔。
 
你可以通過把item元素打包進一個group中來定義菜單組menu groups,然後通過在一個item中嵌入另外一個menu來創建子菜單。每個元素都支持必需的屬性來控制快捷鍵,複選框,圖標,以及更多特性。
 
要了解這些屬性和更多的XML語法,請參見可用資源類型Available Resource Types中的相關主題。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/iefreer/archive/2009/09/21/4577138.aspx

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章