上下文菜單ContextMenu可以像操作Options Menu那樣給上下文菜單增加菜單項。
上下文菜單與Options Menu最大的不同在於,Options Menu的擁有者是Activity,而上下文菜單的擁有者是Activity中的View。每個Activity有且只有一個Options Menu,它為整個Activity服務。而一個Activity往往有多個View,並不是每個View都有上下文菜單,這就需要我們顯示地通過registerForContextMenu(View view)來指定。
盡管上下文菜單的擁有者是View,生成上下文菜單卻是通過Activity中的onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,該方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。兩者的不同在於,onCreateOptionsMenu只在用戶第一次按“Menu”鍵時被調用,而onCreateContextMenu會在用戶每一次長按View時被調用,而且View必須已經注冊了上下文菜單。
一、程序文件
在上一章節OptionsMenu我們通過xml文件配置菜單項,本章我們直接采用代碼完成,故不使用布局文件。
打開“src/com.genwoxue.contextmenu/MainActivity.java”文件。
然後輸入以下代碼:
[java] view plain copy
- package com.genwoxue.contextmenu;
-
- import android.os.Bundle;
- import android.view.View;
- import android.app.ListActivity;
- import android.view.ContextMenu;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.widget.ArrayAdapter;
- import android.widget.Toast;
-
- public class MainActivity extends ListActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
- // 顯示列表
- simpleShowList();
- // 為所有列表項注冊上下文菜單
- this.registerForContextMenu(getListView());
-
- }
-
- private void simpleShowList() {
-
- // 模擬文件列表,在項目中可以實際讀取文件列表
- String[] files =new String[] {
- "關於工信部網站備案通知.doc",
- "企業年度預決算報表.xls",
- "客戶說明會.ppt",
- "企業形像宣傳片.avi"
- };
-
- // 數據適配器 simple array adapter
- ArrayAdapter adapter =new ArrayAdapter(this,android.R.layout.simple_list_item_1,files);
-
- // 填充列表
- this.setListAdapter(adapter);
-
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
-
- // 設置ContextMenu標題
- menu.setHeaderTitle("文件操作");
- // 添加ContextMenu菜單項
- menu.add(0, 1, Menu.NONE, "藍牙發送");
- menu.add(0, 2, Menu.NONE, "標記為重要");
- menu.add(0, 3, Menu.NONE, "重命名");
- menu.add(0, 4, Menu.NONE, "刪除");
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
-
- // 得到當前被選中的item信息
- switch(item.getItemId()) {
- case 1:
- Toast.makeText(getApplicationContext(), "發送文件", Toast.LENGTH_SHORT).show();
- break;
- case 2:
- Toast.makeText(getApplicationContext(), "標記為重要☆☆☆", Toast.LENGTH_SHORT).show();
- break;
- case 3:
- Toast.makeText(getApplicationContext(), "重命名", Toast.LENGTH_SHORT).show();
- break;
- case 4:
- Toast.makeText(getApplicationContext(), "刪除", Toast.LENGTH_SHORT).show();
- break;
- default:
- return super.onContextItemSelected(item);
- }
- return true;
- }
- }
ContextMenu與OptionsMenu菜單有著很多相似之和,在此就不贅述了。
二、運行結果
特別說明:
另一個值得注意的ContextMenuInfo,該類的對象被傳入onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,那麼它有什麼用呢?有時候,視圖元素需要向上下文菜單傳遞一些信息,比如該View對應DB記錄的ID等,這就要使用ContextMenuInfo。需要傳遞額外信息的View需要重寫getContextMenuInfo()方法,返回一個帶有數據的ContextMenuInfo實現類對象。