长下文菜单,即长按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 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
2
3 <item
4 android:id="@+id/action_menu_1"
5 android:orderInCategory="100"
6 android:showAsAction="never"
7 android:title="复制"/>
8 <item
9 android:id="@+id/action_menu_2"
10 android:orderInCategory="100"
11 android:showAsAction="never"
12 android:title="粘贴"/>
13 <item
14 android:id="@+id/action_menu_3"
15 android:orderInCategory="100"
16 android:showAsAction="never"
17 android:title="剪切"/>
18
19 </menu>
可以看到两个菜单项,看下菜单项的各个属性:
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 this.registerForContextMenu(list);
1 //创建上下文菜单
2 @Override
3 public void onCreateContextMenu(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 代表点击列表中第几项出现的上下文菜单)
1 @Override
2 public boolean 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 return super.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 class ContextMenu_List extends Activity{
20 private ListView list;
21 @Override
22 protected void onCreate(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(new OnItemClickListener() {
32
33 @Override
34 public void onItemClick(AdapterView<?> parent, View arg1, int pos,
35 long id) {
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 @Override
46 public void onCreateContextMenu(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 @Override
65 public boolean 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 return super.onContextItemSelected(item);
82
83 }
84
85 }
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <ListView
8 android:id="@+id/listView1"
9 android:entries="@array/list"
10
11 android:layout_width="match_parent"
12 android:layout_height="wrap_content" >
13 </ListView>
14
15 </LinearLayout>
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4 <string-array name = "list">
5 <item>山东大学</item>
6 <item>山东科技大学</item>
7 <item>山东理工大学</item>
8 <item>山东建筑大学</item>
9 <item>山东农业大学</item>
10 <item>济南大学</item>
11 <item>烟台大学</item>
12 <item>鲁东大学</item>
13 <item>临沂大学</item>
14 <item>聊城大学</item>
15 </string-array>
16 </resources>
效果图: