长下文菜单,即长按view显示一个菜单栏
与OptionMenu的区别
OptionMenu对应的是activity,一个activity只能拥有一个选项菜单
ContextMenu对应的是View,每个View都可以设置上下文菜单
一般情况下ContextMenu常用语ListView或者GridView;
创建和响应上下文菜单过程:
1.在activity的onCreate(...)方法中为一个view注册上下文菜单
2.在onCreateContextMenuInfo(...)中生成上下文菜单。
3.在onContextItemSelected(...)中响应上下文菜单项。
有两种方式实现:
一、java代码动态实现
1 menu.setHeaderTitle("操作");2 menu.setHeaderIcon(R.drawable.icon_72);3
4 //动态添加上下文菜单
5 menu.add(1, 100, 1, "复制");6 menu.add(1, 101, 1, "粘贴");7 menu.add(1, 102, 1, "剪切");
二、xml文件静态实现
1 MenuInflater inflater =getMenuInflater();2 inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
看这一行代码,
我们找到其对应的文件
main.xml文件代码如下:
1
2
3
5 android:orderInCategory="100"
6 android:showAsAction="never"
7 android:title="复制"/>
8
10 android:orderInCategory="100"
11 android:showAsAction="never"
12 android:title="粘贴"/>
13
15 android:orderInCategory="100"
16 android:showAsAction="never"
17 android:title="剪切"/>
18
19
可以看到两个菜单项,看下菜单项的各个属性:
1、 android:id=
是菜单项id
2、android:orderInCategory=
是菜单项优先级,值越大,优先级越多,当菜单项过多时,可隐藏在折叠菜单中
3、android:showAsAction=
原来是特定版本用到的,当你的应用程序目标设为蜂巢平台(即 Android 3.0)时,你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角, 对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。 这个属性可接受的值有:
1.alaways:这个值会使菜单项一直显示在ActionBar上。
2.ifRoom:如果有足够的空间,这个值会使菜单显示在ActionBar上。
3.never:这个值菜单永远不会出现在ActionBar是。
4.withText:这个值使菜单和它的图标,菜单文本一起显示。
4、android:title=
是菜单项名字
1)注册上下文菜单
1 this.registerForContextMenu(list);
2)生成上下文菜单
1 //创建上下文菜单
2 @Override3 public voidonCreateContextMenu(ContextMenu menu, View v,4 ContextMenuInfo menuInfo) {5 //TODO Auto-generated method stub
6 super.onCreateContextMenu(menu, v, menuInfo);7 //设置menu显示的内容
8
9 menu.setHeaderTitle("操作"); //菜单栏标题10 menu.setHeaderIcon(R.drawable.icon_72); //菜单栏图标11
12 //动态添加上下文菜单13 //menu.add(1, 100, 1, "复制");14 //menu.add(1, 101, 1, "粘贴");15 //menu.add(1, 102, 1, "剪切");16 //xml文件静态创建
17 MenuInflater inflater =getMenuInflater();18 inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
19 }20
在onCreateContextMenu()方法中获得点击的列表项
1 AdapterContextMenuInfo menuInfos =(AdapterContextMenuInfo) menuInfo;2 curItemPosition =menuInfos.position;(curItemPosition 代表点击列表中第几项出现的上下文菜单)
3)响应上下文菜单项
1 @Override2 publicboolean onContextItemSelected(MenuItem item) {3 //TODO Auto-generated method stub
4 switch(item.getItemId()) {5 case 100:6 Toast.makeText(ContextMenu_List.this, "选择的复制操作", 1).show();7 break;8 case 101:9 Toast.makeText(ContextMenu_List.this, "选择的粘贴操作", 1).show();10 break;11 case 102:12 Toast.makeText(ContextMenu_List.this, "选择的剪切操作", 1).show();13 break;14
15 default:16 break;17 }18 returnsuper.onContextItemSelected(item);19
20 }
完整代码:
1 package information;2
3 import com.example.allcode.R;4
5 import android.app.Activity;6 import android.os.Bundle;7 import android.view.ContextMenu;8 import android.view.MenuInflater;9 import android.view.MenuItem;10 import android.view.View;11 import android.view.ContextMenu.ContextMenuInfo;12 import android.view.animation.AnimationUtils;13 import android.view.animation.LayoutAnimationController;14 import android.widget.AdapterView;15 import android.widget.AdapterView.OnItemClickListener;16 import android.widget.ListView;17 import android.widget.Toast;18
19 public classContextMenu_List extends Activity{20 privateListView list;21 @Override22 protected voidonCreate(Bundle savedInstanceState) {23 //TODO Auto-generated method stub
24 super.onCreate(savedInstanceState);25 setContentView(R.layout.donghua_layout);26
27
28 list =(ListView) findViewById(R.id.listView1);29 this.registerForContextMenu(list);30 //为列表视图中选中的项添加响应事件
31 list.setOnItemClickListener(newOnItemClickListener() {32
33 @Override34 public void onItemClick(AdapterView> parent, View arg1, intpos,35 longid) {36 //TODO Auto-generated method stub
37 String result = parent.getItemAtPosition(pos).toString(); //获取选择项的值
38 Toast.makeText(ContextMenu_List.this, "点击了"+result, Toast.LENGTH_SHORT).show();//输出选中项消息
39 }40 });41
42
43 }44 //创建上下文菜单
45 @Override46 public voidonCreateContextMenu(ContextMenu menu, View v,47 ContextMenuInfo menuInfo) {48 //TODO Auto-generated method stub
49 super.onCreateContextMenu(menu, v, menuInfo);50 //设置menu显示的内容
51
52 menu.setHeaderTitle("操作");53 menu.setHeaderIcon(R.drawable.icon_72);54
55 //动态添加上下文菜单56 //menu.add(1, 100, 1, "复制");57 //menu.add(1, 101, 1, "粘贴");58 //menu.add(1, 102, 1, "剪切");59 //xml文件静态创建
60 MenuInflater inflater =getMenuInflater();61 inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
62 }63
64 @Override65 publicboolean onContextItemSelected(MenuItem item) {66 //TODO Auto-generated method stub
67 switch(item.getItemId()) {68 case 100:69 Toast.makeText(ContextMenu_List.this, "选择的复制操作", 1).show();70 break;71 case 101:72 Toast.makeText(ContextMenu_List.this, "选择的粘贴操作", 1).show();73 break;74 case 102:75 Toast.makeText(ContextMenu_List.this, "选择的剪切操作", 1).show();76 break;77
78 default:79 break;80 }81 returnsuper.onContextItemSelected(item);82
83 }84
85 }
ContextMenu_List.java
1 <?xml version="1.0" encoding="utf-8"?>
2
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7
9 android:entries="@array/list"
10
11 android:layout_width="match_parent"
12 android:layout_height="wrap_content" >
13
14
15
donghua_layout.xml
1 <?xml version="1.0" encoding="utf-8"?>
2
3
4
5 山东大学
6 山东科技大学
7 山东理工大学
8 山东建筑大学
9 山东农业大学
10 济南大学
11 烟台大学
12 鲁东大学
13 临沂大学
14 聊城大学
15
16
arrays.xml
效果图: