Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android用戶界面-菜單

android用戶界面-菜單

編輯:Android開發實例

創建菜單 Creating Menus 

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()方法分配的整數。一旦你識別了這個菜單項,就可以采取合適的動作。

下面是一個活動裡的例子,其中我們創建了一個選項菜單並處理菜單項的選擇:

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;

}   

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

提示: 如果你有一些可以以一個標題歸類的菜單項,考慮以子菜單Submenu的方式組織它們。

增加圖標Adding icons

圖標也可以通過setIcon()函數被添加到菜單項中。

Java代碼
  1. 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("退出!");
break;
}
return true;
}
}

 

 

 

 

 

上下文菜單Context Menu

 

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

注意:上下文菜單項不支持圖標或快捷鍵。

為了創建一個上下文菜單,你必須重寫這個活動的上下文菜單回調函數:onCreateContextMenu() 和onContextItemSelected()。在回調函數onCreateContextMenu()裡,你可以通過使用一個add()方法來添加菜單項,或者通過擴充一個定義在XML中的菜單資源。然後,通過registerForContextMenu()為這個視圖注冊一個上下文菜單ContextMenu.

比如,下面的代碼可以被用到Notepad應用程序中來為列表中的每一個注釋添加一個上下文菜單:

Java代碼

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) 方法:

Java代碼
  1. registerForContextMenu(getListView());  

記住,你可以傳遞任何視圖對象來注冊一個上下文菜單。這裡,getListView()返回這個被用於Notepad應用程序的列表活動ListActivity中的列表視圖對象。這樣,這個列表中的任何item都被注冊到這個上下文菜單。

 

 
package com.amaker.test;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.TextView;

/**
*
* @author 測試上下文菜單,改變背景色
*/
public class MainActivity extends Activity {
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;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
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, "白色背景");
}

@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITME1:
myTV.setBackgroundColor(Color.RED);
break;
case ITME2:
myTV.setBackgroundColor(Color.GREEN);
break;
case ITME3:
myTV.setBackgroundColor(Color.WHITE);
break;
}
return true;
}
}

 

 


 

 

子菜單Submenus

 

一個子菜單可以被添加進任何菜單中,但不能加入另外的子菜單中。當你的應用程序有很多功能可以按主題組織的時候,這將非常有用,就好比PC應用程序的菜單欄(文件,編輯,視圖,等)。

子菜單通過addSubMenu()加入到已有的菜單中而創建。該函數會返回一個子菜單SubMenu對象(菜單Menu的一個擴展)。然後你可以通過調用add()方法給這個菜單添加其他項,例如:

Java代碼

public boolean onCreateOptionsMenu(Menu menu) 

 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中定義父菜單時增加子菜單。

 

在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 的文件。

Java代碼

<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()方法擴充這個資源:

Java代碼

public boolean onCreateOptionsMenu(Menu menu) 

{    

MenuInflater inflater = getMenuInflater();   

 inflater.inflate(R.menu.options_menu, menu);   

 return true;

}  

getMenuInflater() 方法返回我們活動上下文的MenuInflater。然後我們調用inflate(),傳遞給它一個指向我們菜單資源的指針以及回調給出的菜單對象。

盡管和在onCreateOptionsMenu()創建菜單比較起來,上面的例子看起來做了更多的事情,但是如果處理更多的菜單項,這將省掉很多麻煩並讓你的代碼簡潔。

你可以通過把item元素打包進一個group中來定義菜單組menu groups,然後通過在一個item中嵌入另外一個menu來創建子菜單。每個元素都支持必需的屬性來控制快捷鍵,復選框,圖標,以及更多特性。

 
package com.amaker.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
/**
*
* 選項菜單實例
*/
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) {
SubMenu file = menu.addSubMenu("文件");
SubMenu edit = menu.addSubMenu("編輯");
file.add(0, ITEM1, 0, "新建");
file.add(0, ITEM2, 0, "打開");
return true;
}

/**
* 覆蓋該方法,響應菜單選項被單擊事件
*/
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM1:
setTitle("新建文件!");
break;
case ITEM2:
setTitle("打開文件!");
break;
}
return true;
}
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved