长下文菜单,即长按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)注册上下文菜单
1 this.registerForContextMenu(list);
2)生成上下文菜单
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 代表点击列表中第几项出现的上下文菜单)
3)响应上下文菜单项
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>
效果图: