Android系統(tǒng)快捷菜單(Context Menu)同樣采用了浮動窗體的顯示方式,與子菜單的實現方式相同,但兩種菜單的啟動方式卻截然不同。
·啟動方式:快捷菜單類似于普通桌面程序中的“右鍵菜單”,當用戶點擊界面元素超過2秒后,將啟動注冊到該界面元素的快捷菜單。
·使用方法:與使用選項菜單的方法非常相似,需要重載onCreateContextMenu()方法和onContextItemSelected()方法。
1.onCreateContextMenu()方法
onCreateContextMenu()方法主要用來添加快捷菜單所顯示的標題、圖標和菜單子項等內容,選項菜單中的onCreateOptionsMenu()方法僅在選項菜單第一次啟動時被調用一次,而快捷菜單的onCreateContextMenu()方法每次啟動時都會被調用一次。
代碼清單1 onCreateContextMenu ()
final static int CONTEXT_MENU_1 = Menu.FIRST;
final static int CONTEXT_MENU_2 = Menu.FIRST+1;
final static int CONTEXT_MENU_3 = Menu.FIRST+2;
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo){
menu.setHeaderTitle("快捷菜單標題");
menu.add(0, CONTEXT_MENU_1, 0,"菜單子項1");
menu.add(0, CONTEXT_MENU_2, 1,"菜單子項2");
menu.add(0, CONTEXT_MENU_3, 2,"菜單子項3");
}
ContextMenu類支持add()方法(代碼第7行)和addSubMenu()方法,可以在快捷菜單中添加菜單子項和子菜單。
第5行代碼的onCreateContextMenu()方法中的參數:第1個參數menu是需要顯示的快捷菜單;第2個參數v是用戶選擇的界面元素;第3個參數menuInfo是所選擇界面元素的額外信息。
2.onContextItemSelected ()方法
菜單選擇事件的處理需要重載onContextItemSelected()方法,該方法在用戶選擇快捷菜單中的菜單子項后被調用,與onOptionsItemSelected ()方法的使用方法基本相同。
代碼清單2 onContextItemSelected()
@Override
public oolean onContextItemSelected(MenuItem item){
switch(item.getItemId()){
case CONTEXT_MENU_1:
LabelView.setText("菜單子項1");
return true;
case CONTEXT_MENU_2:
LabelView.setText("菜單子項2");
return true;
case CONTEXT_MENU_3:
LabelView.setText("菜單子項3");
return true;
}
return false;
}
3.registerForContextMenu()方法
使用registerForContextMenu()方法,將快捷菜單注冊到界面控件上(代碼清單3中第7行)。這樣,用戶在長時間點擊該界面控件時,便會啟動快捷菜單。
為了能夠在界面上直接顯示用戶所選擇快捷菜單的菜單子項,在代碼中引用了界面元素TextView(代碼清單3中第6行),通過更改TextView的顯示內容,顯示用戶所選擇的菜單子項。
代碼清單3 registerForContextMenu ()
TextView LabelView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LabelView = (TextView)findViewById(R.id.label);
registerForContextMenu(LabelView);
}
4.main.xml
代碼清單4 main.xml
<TextView android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello"
/>
上述代碼為/src/layout/main.xml文件的部分內容,第1行聲明了TextView的ID為label,在代碼清單3的第6行中,通過R.id.label將ID傳遞給findViewById()方法,這樣用戶便能夠引用該界面元素,并能夠修改該界面元素的顯示內容。
需要注意的一點,代碼清單4的第2行,將android:layout_width設置為match_parent,這樣TextView將填充滿父節(jié)點的所有剩余屏幕空間,用戶點擊屏幕TextView下方任何位置都可以啟動快捷菜單。如果將android:layout_width設置為wrap_content,則用戶必須準確單擊TextView才能啟動快捷菜單。
圖1為快捷菜單的運行效果圖。

圖1 運行效果圖
注:菜單可以像界面布局一樣在XML文件中進行定義。使用XML文件定義界面菜單,將代碼與界面設計分類,有助于簡化代碼的復雜程度,并且更有利于界面的可視化。
下面將快捷菜單的示例程序MyContextMenu改用XML實現,新程序的工程名稱為MyXLMContoxtMenu。
首先需要創(chuàng)建保存菜單內容的XML文件:在/src目錄下建立子目錄menu,并在menu下建立context_menu.xml文件,代碼如代碼清單5所示。
代碼清單5 context_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/contextMenu1"
android:title="菜單子項1"/>
<item android:id="@+id/contextMenu2"
android:title="菜單子項2"/>
<item android:id="@+id/contextMenu3"
android:title="菜單子項3"/>
</menu>
在描述菜單的XML文件中,必須以<menu>標簽(代碼第1行)作為根節(jié)點,<item>標簽(代碼第2行)用來描述菜單中的子項,<item>標簽可以通過嵌套實現子菜單的功能。
XML菜單的顯示結果如圖2所示。

圖2 XML菜單的顯示結果
在XML文件中定義菜單后,在onCreateContextMenu()方法中調用inflater.inflate()方法,將XML資源文件傳遞給菜單對象,代碼如代碼清單6所示。
代碼清單6 onCreateContextMenu()
@Override
public void onCreateContextMenu(ContextMenu menu,
View v, ContextMenuInfo menuInfo){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
第4行代碼中的getMenuInflater()為當前的Activity返回MenuInflater;第5行代碼將XML資源文件R.menu.context_menu,傳遞給menu這個快捷菜單對象。