ContextMenu简介

在Windows中,我们已经习惯了在文件上单击右键来执行“打开”、“重名名”、“剪切”、“删除”等操作,这个右键弹出的菜单就是上下文菜单。你可能 会笑道:“哈哈,你不会连快捷键都不会用吧?”。咳咳,这个。。。举个例子嘛。没错,windows中快捷键能帮助我们提高操作的效率,但是android中这招可不管用喽,注意:android的上下文菜单项是不能用快捷键的。因为手机的操作方式与使用鼠标的PC操作方式不同,android是通过长按某个视图元素来弹出上下文菜单的(PS:现在大多数智能机是全触屏的,没有物理键盘,更没有使用快捷键的需要了,这项革新要归功于乔布斯在07发布的革命手机iPhone,老乔退休了,向他致敬!)。除此之外,甚至连图标和子菜单都无法用在Android的上下文菜单项中。那么,Android的上下文菜单到底如何使用?

上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项。上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过registerForContextMenu(View view)来指定

尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,该方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。两者的不同在于,onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。

另一个值得注意的就是上图中的ContextMenuInfo,该类的对象被传入onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。

介绍了这么多,下面给出一个demo演示如何创建和响应上下文菜单:

1.在activity的onCreate(...)方法中为一个view注册上下文菜单

2.在onCreateContextMenuInfo(...)中生成上下文菜单。

3.在onContextItemSelected(...)中响应上下文菜单项。

Demo:使用上下文菜单

1)注册上下文菜单

/***上下文菜单演示Demo**@authorCodingMyWorld2011-8-27下午03:22:39*/publicclassSampleContextMenuActivityextendsListActivity{privatestaticfinalStringTAG="SampleContextMenuActivity";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//显示列表simpleShowList();//为所有列表项注册上下文菜单this.registerForContextMenu(getListView());}privatevoidsimpleShowList(){//listitemString[]files=newString[]{"文件1","文件2","文件3","文件4"};//simplearrayadapterArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,files);//setadapterthis.setListAdapter(adapter);Log.v(TAG,"showsimplelist");}}

2)生成上下文菜单

在activity中重写方法。

@OverridepublicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo){Log.v(TAG,"populatecontextmenu");//setcontextmenutitlemenu.setHeaderTitle("文件操作");//addcontextmenuitemmenu.add(0,1,Menu.NONE,"发送");menu.add(0,2,Menu.NONE,"标记为重要");menu.add(0,3,Menu.NONE,"重命名");menu.add(0,4,Menu.NONE,"删除");}

3)响应上下文菜单项

与响应options menu类似,唯一的不同是可以通过menu info获得额外的信息。

@OverridepublicbooleanonContextItemSelected(MenuItemitem){//得到当前被选中的item信息AdapterContextMenuInfomenuInfo=(AdapterContextMenuInfo)item.getMenuInfo();Log.v(TAG,"contextitemseletedID="+menuInfo.id);switch(item.getItemId()){case1://dosomethingbreak;case2://dosomethingbreak;case3://dosomethingbreak;case4://dosomethingbreak;default:returnsuper.onContextItemSelected(item);}returntrue;}

运行程序,多次唤出上下文菜单,注意LogCat的输出,onCreateContextMenu每一次都被调用了。

更多相关文章

  1. Android照相和录音功能的使用
  2. Android中HttpURLConnection使用详解
  3. Android(安卓)Data Binding简单示例
  4. Xamarin for android:为button设置click事件的几种方法
  5. Android自定义View,你必须知道的几点
  6. Android面试题(基础部分1)
  7. 自定义控件(一)
  8. ADB使用方法及常用命令
  9. Android(安卓)ActionBar使用方法(一)

随机推荐

  1. Android(安卓)代码质量工具集成与应用
  2. Android(安卓)设备电池容量和使用量的获
  3. Android(安卓)控件之Gallery图片集
  4. android 获取文件的扩展名和去掉文件的扩
  5. 总结android中Intent的用法
  6. Android上监听收到的SMS
  7. A first hand look at building an Andro
  8. android混淆出错更新progurad
  9. Android源码在线阅读
  10. 如何在android画分析图(例如 柱状图、趋势