一、概述
Android中,上下文菜單是通過onLongClick(...)事件訪問的。在事件觸發后顯示菜單項。
在使用上下文菜單時,通常在onCreate(...)方法中,先行注冊上下文菜單。在實現onCreateContextMenu(...)方法和onContextItemSelected(...)方法。
注冊菜單方法:registerForContextMenu(...)
注銷注冊菜單方法:unregisterForContextMenu(...)
二、使用XML文件添加上下文菜單
text_menu.xml上下文菜單選項:
1 <?xml version="1.0" encoding="utf-8"?> 2 <menu xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item android:title="File"> 4 <menu> 5 <group android:checkableBehavior="none"> 6 <item android:id="@+id/file_new" 7 android:title="New" 8 android:icon="@android:drawable/ic_input_add" 9 android:alphabeticShortcut="n" /> 10 <item android:id="@+id/file_save" 11 android:title="Save" 12 android:icon="@android:drawable/ic_menu_save" 13 android:alphabeticShortcut="s" /> 14 </group> 15 </menu> 16 </item> 17 <item android:title="Edit"> 18 <menu> 19 <!-- 單選按鈕組 --> 20 <group android:checkableBehavior="single"> 21 <item android:id="@+id/cut" 22 android:title="Cut" 23 android:alphabeticShortcut="Ctrl + x" /> 24 <item android:id="@+id/copy" 25 android:title="Copy" 26 android:alphabeticShortcut="Ctrl + c" /> 27 <item android:id="@+id/paste" 28 android:title="Paste" 29 android:alphabeticShortcut="Ctrl + v" /> 30 </group> 31 </menu> 32 </item> 33 </menu>
在代碼中,添加上下文菜單顯示,及在選擇上下文菜單項時觸發事件(MainActivity.java):
1 public class MainActivity extends Activity 2 { 3 private static final String TAG = "MainActivity"; 4 private Context mContext; 5 private EditText mEditMenu; 6 private MenuInflater mMenuInflater; 7 8 @Override 9 public void onCreate(Bundle savedInstanceState) 10 { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 mContext = getApplicationContext(); 15 16 // 綁定菜單按鈕事件 17 mEditMenu = (EditText) findViewById(R.id.input_text3); 18 // 注冊上下文菜單 19 registerForContextMenu(mEditMenu); 20 } 21 22 // 上下文菜單,與EditView控件綁定,長按顯示菜單項 23 @Override 24 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) 25 { 26 super.onCreateContextMenu(menu, view, contextMenuInfo); 27 // 創建新的contextMenu對象 28 mMenuInflater = new MenuInflater(this); 29 // 使用XML與原menu對象對新ContextMenu對象初始化 30 mMenuInflater.inflate(R.menu.text_menu, menu); 31 } 32 33 // 上下文菜單,觸發上下文菜單項點擊事件時響應 34 @Override 35 public boolean onContextItemSelected(MenuItem item) 36 { 37 switch (item.getItemId()) 38 { 39 case R.id.file_new: 40 { 41 Toast.makeText(mContext, "File new.", Toast.LENGTH_SHORT).show(); 42 break; 43 } 44 case R.id.file_save: 45 { 46 Toast.makeText(mContext, "File save.", Toast.LENGTH_SHORT).show(); 47 break; 48 } 49 case R.id.cut: 50 { 51 Toast.makeText(mContext, "Edit cut.", Toast.LENGTH_SHORT).show(); 52 break; 53 } 54 case R.id.copy: 55 { 56 Toast.makeText(mContext, "Edit copy.", Toast.LENGTH_SHORT).show(); 57 break; 58 } 59 case R.id.paste: 60 { 61 Toast.makeText(mContext, "Edit paste.", Toast.LENGTH_SHORT).show(); 62 break; 63 } 64 default: 65 Toast.makeText(mContext, "無響應", Toast.LENGTH_SHORT).show(); 66 } 67 return true; 68 } 69 70 // 注銷注冊過的上下文菜單 71 @Override 72 public void onDestroy() 73 { 74 super.onDestroy(); 75 unregisterForContextMenu(mEditMenu); 76 } 77 }
PS:ContextMenu的任何項在被選中后,整個ContextMenu會自動被系統關閉掉,即使多選項也是這樣。這樣的話,多選項的行為就有些怪異。查看Android的源碼后,發現這是個Android的bug,應該是google沒考慮多選項的情況。
盡管上下文菜單的擁有者是View,生成上下文菜單卻是通過Activity中的onCreateContextMenu ( ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,該方法很像生成Options Menu的onCreateOptionsMenu ( Menu menu)方法。兩者的不同在於,onCreateOptionsMenu 只在用戶 第一次 按“Menu”鍵時被調用,而onCreateContextMenu 會在用戶 每一次 長按View時被調用,而且View必須已經注冊了上下文菜單。