首页 > 代码库 > Android 上下文菜单(Context Menu)

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     @Override24     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     @Override35     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     @Override72     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必须已经注册了上下文菜单。

Android 上下文菜单(Context Menu)