Android 上下文菜單(Context Menu)


一、概述

  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必須已經注冊了上下文菜單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM