Android提供了三種基礎菜單類型:
選項菜單Options Menu
這是一個活動的主菜單。通過按下裝置菜單鍵來顯示它。選項菜單包含兩組菜單項:
圖示菜單Icon Menu
這個是當使用者按下菜單鍵時最初出現螢幕下方的item集合。它支援最多6個菜單項。隻有這些菜單支援圖示而且這些菜單并不支援checkboxes或者radio buttons。
擴充菜單Expanded Menu
這是通過按“更多”菜單顯現出來的一個豎向的項目清單。它僅當圖示菜單過多時存在而且是由6個以及其它選項菜單組成。
上下文菜單Context Menu
這是一個浮動菜單清單,通常在你長時間按在一個視圖上時出現(比如一個清單項)
子菜單Submenu
這是一個浮動菜單清單,通過在選項菜單或上下文菜單選擇菜單項顯露出來。不支援嵌套子菜單。
選項菜單應該包含應用程式的基本功能以及任何必要的浏覽項(例如,傳回桌面或應用程式設定)。你還可以通過增加子菜單Submenus來組織主題和包含額外的菜單功能。
當菜單第一次被打開時,系統會調用活動onCreateOptionsMenu()回調函數。重寫該方法并生成傳遞給你的這個菜單對象。你可以通過擴充定義在XML檔案中的一個菜單資源或者通過為你想要的每一個菜單項調用add()方法生成這個菜單。這個方法增加一個菜單項MenuItem,并傳回新建立的對象。你可以用傳回的MenuItem來設定附加屬性如圖示,快捷鍵,意圖以及這個菜單項的其它設定。
有多個add()方法。通常,你會使用接受一個itemId參數的那個。這是一個唯一的整數,允許你在回調函數中識别這個item。
當一個菜單項從選項菜單中被選擇時,你會接收到一個onOptionsItemSelected()回調。這個回調傳給你選中的MenuItem。你可以通過請求itemId:getItemId()來識别它,這将傳回add()方法配置設定的整數。一旦你識别了這個菜單項,就可以采取合适的動作。
下面是一個活動裡的例子,其中我們建立了一個選項菜單并處理菜單項的選擇:
Java代碼
/* Creates the menu items */
public boolean onCreateOptionsMenu(Menu menu)
{
menu.add(0, MENU_NEW_GAME, 0, "New Game");
menu.add(0, MENU_QUIT, 0, "Quit");
return true;
}
/* Handles item selections */
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case MENU_NEW_GAME: newGame(); return true;
case MENU_QUIT: quit(); return true;
return false;
這個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 來完成這種行為。
執行個體:
/Chapter04_UI_Menu01/src/com/amaker/test/MainActivity.java
代碼
package com.amaker.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
/**
*
* 選項菜單執行個體
*/
public class MainActivity extends Activity {
private static final int ITEM1 = Menu.FIRST;
private static final int ITEM2 = Menu.FIRST+1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/**
* 覆寫該方法添加菜單項
*/
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, ITEM1, 0, "開始");
menu.add(0, ITEM2, 0, "退出");
return true;
* 覆寫該方法,響應菜單選項被單擊事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM1:
setTitle("開始遊戲!");
break;
case ITEM2:
setTitle("退出!");
}
}
Android的上下文菜單在概念上和PC軟體的右鍵菜單類似。當一個視圖注冊到一個上下文菜單時,執行一個在該對象上的“長按”(按住不動差不多兩秒鐘)動作,将出現一個提供相關功能的浮動菜單。上下文菜單可以被注冊到任何視圖對象中,不過,最常見的是用于清單視圖ListView的item,在按中清單項時,會轉換其背景色而提示将呈現上下文菜單。 (電話聯系人清單提供了關于這個特性的一個很好的例子)。
注意:上下文菜單項不支援圖示或快捷鍵。
為了建立一個上下文菜單,你必須重寫這個活動的上下文菜單回調函數:onCreateContextMenu() 和onContextItemSelected()。在回調函數onCreateContextMenu()裡,你可以通過使用一個add()方法來添加菜單項,或者通過擴充一個定義在XML中的菜單資源。然後,通過registerForContextMenu()為這個視圖注冊一個上下文菜單ContextMenu.
比如,下面的代碼可以被用到Notepad應用程式中來為清單中的每一個注釋添加一個上下文菜單:
public void onCreateContextMen(ContextMenu menu, View v, ContextMenuInfo menuInfo)
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, EDIT_ID, 0, "Edit");
menu.add(0, DELETE_ID, 0, "Delete");
public boolean onContextItemSelected(MenuItem item)
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case EDIT_ID: editNote(info.id); return true;
case DELETE_ID: deleteNote(info.id); return true;
default: return super.onContextItemSelected(item);
在onCreateContextMenu()中,除了給出将添加MenuItems的ContextMenu外,還需要給定選中的視圖和一個上下文菜單資訊ContextMenuInfo對象,該對象提供了選中對象的附加資訊。在本例中,onCreateContextMenu()沒做什麼特别的事-隻是添加了一些菜單項。在onContextItemSelected() 回調函數中,我們從MenuItem中請求AdapterContextMenuInfo,該對象提供目前選中項的資訊。我們從中所要的隻是這個選中項的清單ID,是以無論編輯還是删除一個注釋,我們通過這個對象的AdapterContextMenuInfo.info字段來找到該ID。這個ID被傳遞給editNote() 和deleteNote()方法來執行相應的動作。
現在,要為一個清單視圖中的所有項注冊上下文菜單,我們可以傳遞整個的清單視圖對象給registerForContextMenu(View) 方法:
registerForContextMenu(getListView());
記住,你可以傳遞任何視圖對象來注冊一個上下文菜單。這裡,getListView()傳回這個被用于Notepad應用程式的清單活動ListActivity中的清單視圖對象。這樣,這個清單中的任何item都被注冊到這個上下文菜單。
import android.graphics.Color;
import android.view.ContextMenu;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.TextView;
* @author 測試上下文菜單,改變背景色
private static final int ITME1 = Menu.FIRST;
private static final int ITME2 = Menu.FIRST+1;
private static final int ITME3 = Menu.FIRST+2;
private TextView myTV;
myTV = (TextView)findViewById(R.id.TextView01);
registerForContextMenu(myTV);
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, ITME1, 0, "紅色背景");
menu.add(0, ITME2, 0, "綠色背景");
menu.add(0, ITME3, 0, "白色背景");
public boolean onContextItemSelected(MenuItem item) {
case ITME1:
myTV.setBackgroundColor(Color.RED);
case ITME2:
myTV.setBackgroundColor(Color.GREEN);
case ITME3:
myTV.setBackgroundColor(Color.WHITE);
一個子菜單可以被添加進任何菜單中,但不能加入另外的子菜單中。當你的應用程式有很多功能可以按主題組織的時候,這将非常有用,就好比PC應用程式的菜單欄(檔案,編輯,視圖,等)。
子菜單通過addSubMenu()加入到已有的菜單中而建立。該函數會傳回一個子菜單SubMenu對象(菜單Menu的一個擴充)。然後你可以通過調用add()方法給這個菜單添加其他項,例如:
boolean result = super.onCreateOptionsMenu(menu);
SubMenu fileMenu = menu.addSubMenu("File");
SubMenu editMenu = menu.addSubMenu("Edit");
fileMenu.add("new");
fileMenu.add("open");
fileMenu.add("save");
editMenu.add("undo");
editMenu.add("redo");
return result;
子菜單中選擇項的回調動作将由父菜單的回調方法處理。比如上面的例子,子菜單中的選擇将由onOptionsItemSelected() 回調處理。
你也可以在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 的檔案。
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/new_game" android:title="New Game" />
<item android:id="@+id/quit" android:title="Quit" />
</menu>
然後,在onCreateOptionsMenu()方法裡,我們通過MenuInflater.inflate()方法擴充這個資源:
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
getMenuInflater() 方法傳回我們活動上下文的MenuInflater。然後我們調用inflate(),傳遞給它一個指向我們菜單資源的指針以及回調給出的菜單對象。
盡管和在onCreateOptionsMenu()建立菜單比較起來,上面的例子看起來做了更多的事情,但是如果處理更多的菜單項,這将省掉很多麻煩并讓你的代碼簡潔。
你可以通過把item元素打包進一個group中來定義菜單組menu groups,然後通過在一個item中嵌入另外一個menu來建立子菜單。每個元素都支援必需的屬性來控制快捷鍵,複選框,圖示,以及更多特性。
import android.view.SubMenu;
*/
* 覆寫該方法添加子菜單項
*/
SubMenu file = menu.addSubMenu("檔案");
SubMenu edit = menu.addSubMenu("編輯");
file.add(0, ITEM1, 0, "建立");
file.add(0, ITEM2, 0, "打開");
setTitle("建立檔案!");
setTitle("打開檔案!");
本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1080704