操作功能表與當前獲得焦點的view關聯,並通過按下軌跡球、D-pad的中鍵,或常按View3秒來觸發。
定義和填入操作功能表和Activity菜單類似。為特定的View建立操作功能表有兩種方式。
建立操作功能表
第一種方式是為View類建立通用的操作功能表,通過重寫View的onCreateContextMenu處理函數,如下:
@Override
public void onCreateContextMenu(ContextMenu menu) {
super.onCreateContextMenu(menu);
menu.add(“ContextMenuItem1”);
}
這種方式建立的操作功能表會在任何包含View類的Activity中獲得。
更加變通的方式是建立Activity指定的操作功能表,通過重寫onCreateContextMenu方法並註冊需要操作功能表的View。註冊View使用registerForContextMenu方法,傳入View,如下代碼所示:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
EditText view = new EditText(this);
setContentView(view);
registerForContextMenu(view);
}
一旦View被註冊,任何操作功能表該顯示的時候,onCreateContextMenu處理函數都會被觸發。
重寫onCreateContextMenu方法,並檢查哪個View觸發菜單建立,並填入合適的功能表項目,如下面的程式碼片段所示:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(“Context Menu”);
menu.add(0, menu.FIRST, Menu.NONE, “Item 1”).setIcon(R.drawable.menu_item);
menu.add(0, menu.FIRST+1, Menu.NONE, “Item 2”).setCheckable(true);
menu.add(0, menu.FIRST+2, Menu.NONE, “Item 3”).setShortcut(‘3’, ‘3’);
SubMenu sub = menu.addSubMenu(“Submenu”);
sub.add(“Submenu Item”);
}
如上所示,ContextMenu類支援和Menu類相同的add方法,所以,你可以用和Activity的Menu相同的方法填入操作功能表項目——包括子功能表,但它們倆都不支援表徵圖。你也可以指定操作功能表頭條的文本和表徵圖。
Android支援使用Intent Filter運行時填入操作功能表。這個機制允許你指定當前的View呈現的資料類型和詢問其它Android應用程式是否支援一些行為來填入操作功能表。這個行為最普通的例子是EditText控制項上的剪下、拷貝、粘貼功能表項目。這些內容將在下一章詳細描述。
處理操作功能表選擇
操作功能表項目選擇的處理和Activity的菜單相似。你可以附加一個Intent或者功能表項目Click Listener到每個功能表項目上,或者通過重寫Activity中的onContextItemSelected這個首選技巧。
在Activity裡,什麼時候操作功能表項目被選擇,這個事件處理函數就被觸發。一個架構實現如下所示:
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
[ ... Handle menu item selection ... ]
return false;
}