Android 上下文菜单(Context Menu)

幼敏悟过人,读书辄成诵。这篇文章主要讲述Android 上下文菜单(Context Menu)相关的知识,希望能为你提供帮助。
一、概述
android中,上下文菜单是通过onLongClick(...)事件访问的。在事件触发后显示菜单项。
在使用上下文菜单时,通常在onCreate(...)方法中,先行注册上下文菜单。在实现onCreateContextMenu(...)方法和onContextItemSelected(...)方法。
【Android 上下文菜单(Context Menu)】注册菜单方法: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" 7android:title="New" 8android:icon="@android:drawable/ic_input_add" 9android:alphabeticShortcut="n" /> 10< item android:id="@+id/file_save" 11android:title="Save" 12android:icon="@android:drawable/ic_menu_save" 13android: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" 22android:title="Cut" 23android:alphabeticShortcut="Ctrl + x" /> 24< item android:id="@+id/copy" 25android:title="Copy" 26android:alphabeticShortcut="Ctrl + c" /> 27< item android:id="@+id/paste" 28android:title="Paste" 29android:alphabeticShortcut="Ctrl + v" /> 30< /group> 31< /menu> 32< /item> 33 < /menu>

在代码中,添加上下文菜单显示,及在选择上下文菜单项时触发事件(MainActivity.java):
1 public class MainActivity extends Activity 2 { 3private static final String TAG = "MainActivity"; 4private Context mContext; 5private EditText mEditMenu; 6private MenuInflater mMenuInflater; 7 8@Override 9public void onCreate(Bundle savedInstanceState) 10{ 11super.onCreate(savedInstanceState); 12setContentView(R.layout.activity_main); 13 14mContext = getApplicationContext(); 15 16// 绑定菜单按钮事件 17mEditMenu = (EditText) findViewById(R.id.input_text3); 18// 注册上下文菜单 19registerForContextMenu(mEditMenu); 20} 21 22// 上下文菜单,与EditView控件绑定,长按显示菜单项 23@Override 24public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) 25{ 26super.onCreateContextMenu(menu, view, contextMenuInfo); 27// 创建新的contextMenu对象 28mMenuInflater = new MenuInflater(this); 29// 使用XML与原menu对象对新ContextMenu对象初始化 30mMenuInflater.inflate(R.menu.text_menu, menu); 31} 32 33// 上下文菜单,触发上下文菜单项点击事件时响应 34@Override 35public boolean onContextItemSelected(MenuItem item) 36{ 37switch (item.getItemId()) 38{ 39case R.id.file_new: 40{ 41Toast.makeText(mContext, "File new.", Toast.LENGTH_SHORT).show(); 42break; 43} 44case R.id.file_save: 45{ 46Toast.makeText(mContext, "File save.", Toast.LENGTH_SHORT).show(); 47break; 48} 49case R.id.cut: 50{ 51Toast.makeText(mContext, "Edit cut.", Toast.LENGTH_SHORT).show(); 52break; 53} 54case R.id.copy: 55{ 56Toast.makeText(mContext, "Edit copy.", Toast.LENGTH_SHORT).show(); 57break; 58} 59case R.id.paste: 60{ 61Toast.makeText(mContext, "Edit paste.", Toast.LENGTH_SHORT).show(); 62break; 63} 64default: 65Toast.makeText(mContext, "无响应", Toast.LENGTH_SHORT).show(); 66} 67return true; 68} 69 70// 注销注册过的上下文菜单 71@Override 72public void onDestroy() 73{ 74super.onDestroy(); 75unregisterForContextMenu(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必须已经注册了上下文菜单。

    推荐阅读