編輯:Android開發實例
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;
}
提示: 如果你有一些可以以一個標題歸類的菜單項,考慮以子菜單Submenu的方式組織它們。
增加圖標Adding icons
圖標也可以通過setIcon()函數被添加到菜單項中。
Java代碼修改菜單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;
}
}
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代碼記住,你可以傳遞任何視圖對象來注冊一個上下文菜單。這裡,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;
}
}
一個子菜單可以被添加進任何菜單中,但不能加入另外的子菜單中。當你的應用程序有很多功能可以按主題組織的時候,這將非常有用,就好比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中定義父菜單時增加子菜單。
就像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;
}
}
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
本文介紹一個簡易的標准體重計算器Android應用的開發實例。此功能在以前的手