Android系统快捷菜单(Context Menu)同样采用了浮动窗体的显示方式,与子菜单的实现方式相同,但两种菜单的启动方式却截然不同。
·启动方式:快捷菜单类似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒后,将启动注册到该界面元素的快捷菜单。
·使用方法:与使用选项菜单的方法非常相似,需要重载onCreateContextMenu()方法和onContextItemSelected()方法。
1.onCreateContextMenu()方法
onCreateContextMenu()方法主要用来添加快捷菜单所显示的标题、图标和菜单子项等内容,选项菜单中的onCreateOptionsMenu()方法仅在选项菜单第一次启动时被调用一次,而快捷菜单的onCreateContextMenu()方法每次启动时都会被调用一次。
代码清单1 onCreateContextMenu ()
final static int CONTEXT_MENU_1 = Menu.FIRST;
final static int CONTEXT_MENU_2 = Menu.FIRST+1;
final static int CONTEXT_MENU_3 = Menu.FIRST+2;
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo){
menu.setHeaderTitle("快捷菜单标题");
menu.add(0, CONTEXT_MENU_1, 0,"菜单子项1");
menu.add(0, CONTEXT_MENU_2, 1,"菜单子项2");
menu.add(0, CONTEXT_MENU_3, 2,"菜单子项3");
}
ContextMenu类支持add()方法(代码第7行)和addSubMenu()方法,可以在快捷菜单中添加菜单子项和子菜单。
第5行代码的onCreateContextMenu()方法中的参数:第1个参数menu是需要显示的快捷菜单;第2个参数v是用户选择的界面元素;第3个参数menuInfo是所选择界面元素的额外信息。
2.onContextItemSelected ()方法
菜单选择事件的处理需要重载onContextItemSelected()方法,该方法在用户选择快捷菜单中的菜单子项后被调用,与onOptionsItemSelected ()方法的使用方法基本相同。
代码清单2 onContextItemSelected()
@Override
public oolean onContextItemSelected(MenuItem item){
switch(item.getItemId()){
case CONTEXT_MENU_1:
LabelView.setText("菜单子项1");
return true;
case CONTEXT_MENU_2:
LabelView.setText("菜单子项2");
return true;
case CONTEXT_MENU_3:
LabelView.setText("菜单子项3");
return true;
}
return false;
}
3.registerForContextMenu()方法
使用registerForContextMenu()方法,将快捷菜单注册到界面控件上(代码清单3中第7行)。这样,用户在长时间点击该界面控件时,便会启动快捷菜单。
为了能够在界面上直接显示用户所选择快捷菜单的菜单子项,在代码中引用了界面元素TextView(代码清单3中第6行),通过更改TextView的显示内容,显示用户所选择的菜单子项。
代码清单3 registerForContextMenu ()
TextView LabelView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LabelView = (TextView)findViewById(R.id.label);
registerForContextMenu(LabelView);
}
4.main.xml
代码清单4 main.xml
<TextView android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello"
/>
上述代码为/src/layout/main.xml文件的部分内容,第1行声明了TextView的ID为label,在代码清单3的第6行中,通过R.id.label将ID传递给findViewById()方法,这样用户便能够引用该界面元素,并能够修改该界面元素的显示内容。
需要注意的一点,代码清单4的第2行,将android:layout_width设置为match_parent,这样TextView将填充满父节点的所有剩余屏幕空间,用户点击屏幕TextView下方任何位置都可以启动快捷菜单。如果将android:layout_width设置为wrap_content,则用户必须准确单击TextView才能启动快捷菜单。
图1为快捷菜单的运行效果图。

图1 运行效果图
注:菜单可以像界面布局一样在XML文件中进行定义。使用XML文件定义界面菜单,将代码与界面设计分类,有助于简化代码的复杂程度,并且更有利于界面的可视化。
下面将快捷菜单的示例程序MyContextMenu改用XML实现,新程序的工程名称为MyXLMContoxtMenu。
首先需要创建保存菜单内容的XML文件:在/src目录下建立子目录menu,并在menu下建立context_menu.xml文件,代码如代码清单5所示。
代码清单5 context_menu.xml
<menu xmlns:android="//schemas.android.com/apk/res/android">
<item android:id="@+id/contextMenu1"
android:title="菜单子项1"/>
<item android:id="@+id/contextMenu2"
android:title="菜单子项2"/>
<item android:id="@+id/contextMenu3"
android:title="菜单子项3"/>
</menu>
在描述菜单的XML文件中,必须以<menu>标签(代码第1行)作为根节点,<item>标签(代码第2行)用来描述菜单中的子项,<item>标签可以通过嵌套实现子菜单的功能。
XML菜单的显示结果如图2所示。

图2 XML菜单的显示结果
在XML文件中定义菜单后,在onCreateContextMenu()方法中调用inflater.inflate()方法,将XML资源文件传递给菜单对象,代码如代码清单6所示。
代码清单6 onCreateContextMenu()
@Override
public void onCreateContextMenu(ContextMenu menu,
View v, ContextMenuInfo menuInfo){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
第4行代码中的getMenuInflater()为当前的Activity返回MenuInflater;第5行代码将XML资源文件R.menu.context_menu,传递给menu这个快捷菜单对象。