上下文菜单不同于选项菜单,选项菜单服务于Activity,而上下文菜单是注册到某个View对象上,如果一个View对象注册了一个上下文菜单,用户可以通过长按(大约2秒)该View对象呼出上下文菜单
上下文菜单不支持快捷菜单(shortcut),其选项菜单也不能附带图标,但可以为上下文菜单的标题指明图标
Activity中与ContextMenu相关函数说明
onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo)每次为View对象呼出上下文菜单时都将调用该方法
参数说明
menu:创建的上下文菜单
v:上下文菜单依附的View对象
menuInfo:上下文菜单需要显示的额外信息
onContextItemSelected(MenuItem item)当用户选中了上下文菜单选项后调用该方法进行处理
参数说明:
item:被选中的上下文菜单
onContextMenuClosed(Menu menu)当上下文菜单关闭时调用该方法
参数说明:
menu:被关闭的上下文菜单
registerForContextMenu(View view)为指定的View对象注册一个上下文菜单
参数说明:
view:要显示上下文菜单的View对象
注意:registerForContextMenu方法执行后会自动为指定的VIew对象添加一个View.onCreateContextMenuLsitener监听器,这样当长按时就会呼出上下文菜单
使用案例:
1.strings.xml
<resources>
<string name="app_name">TestActivity</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="mi1">菜单项1</string>
<string name="mi2">菜单项2</string>
<string name="mi3">菜单项3</string>
<string name="mi4">菜单项4</string>
<string name="mi5">菜单项5</string>
<string name="et1">第一文本框</string>
<string name="et2">第二文本框</string>
</resources>
2.main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 声明一个线性布局 -->
<EditText
android:text="@string/et1"
android:id="@+id/EditText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
/> <!-- 声明一个EditText控件 -->
<EditText
android:text="@string/et2"
android:id="@+id/EditText02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
/> <!-- 声明一个EditText控件 -->
</LinearLayout>
3.Activity
package wyf.jc; //声明包语句
import android.app.Activity; //引入相关类
import android.os.Bundle; //引入相关类
import android.view.ContextMenu; //引入相关类
import android.view.MenuItem; //引入相关类
import android.view.View; //引入相关类
import android.widget.EditText; //引入相关类
public class Sample_6_2 extends Activity {
final int MENU1=1;//每个菜单项目的编号=======begin=========
final int MENU2=2;
final int MENU3=3;
final int MENU4=4;
final int MENU5=5;//每个菜单项目的编号=======end============
@Override
public void onCreate(Bundle savedInstanceState) { //重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//为两个文本框注册上下文菜单
this.registerForContextMenu(findViewById(R.id.EditText01));
this.registerForContextMenu(findViewById(R.id.EditText02));
}
@Override
public void onCreateContextMenu (ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo){//此方法在每次调出上下文菜单时都会被调用一次
menu.setHeaderIcon(R.drawable.header);
if(v==findViewById(R.id.EditText01)){//若是第一个文本框
menu.add(0, MENU1, 0, R.string.mi1);
menu.add(0, MENU2, 0, R.string.mi2);
menu.add(0, MENU3, 0, R.string.mi3);
}
else if(v==findViewById(R.id.EditText02)){//若是第二个文本框
menu.add(0, MENU4, 0, R.string.mi4);
menu.add(0, MENU5, 0, R.string.mi5);
}
}
@Override //菜单项选中状态变化后的回调方法
public boolean onContextItemSelected(MenuItem mi){
switch(mi.getItemId()){
case MENU1:
case MENU2:
case MENU3:
EditText et1=(EditText)this.findViewById(R.id.EditText01);
et1.append("\n"+mi.getTitle()+" 被按下");
break;
case MENU4:
case MENU5:
EditText et2=(EditText)this.findViewById(R.id.EditText02);
et2.append("\n"+mi.getTitle()+" 被按下");
break;
}
return true;
}
}
程序运行图: