上下文菜单ContextMenu的使用

上下文菜单不同于选项菜单,选项菜单服务于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;
     }
 }


程序运行图:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值