标签:contextmenu 详解
二话不说,先上图:
可以很容易看到这是一个类似于Dialog悬浮在活动上的控件,它是由被注册的view长按所触发的。当然啦,也有其他的实现方式,这里就先介绍一下系统的ContextMenu:(先剧透一下,使用方式和Menu是一样的)
Step1:
this.registerForContextMenu(listView);在onCreate里为listView注册ContextMenu,
Step2:
覆写onCreateContextMenu来初始化,这里被打上注释的是动态加载menuItem,静态加载和OptionsMenu是一样的
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo);//上下文菜单的呼出每一次都会被调用 /* menu.setHeaderTitle("文件操作"); menu.add(0, 1, Menu.NONE, "发送");//第一个是组别,第二个是数字是该组里的条目序号 menu.add(0, 2,Menu.NONE, "删除");*///静态添加菜单项 getMenuInflater().inflate(R.menu.menu_main, menu);//资源id易于管理,google推荐 }
Step3:
覆写onContextItemSelected,监听菜单点击事件
@Override public boolean onContextItemSelected(MenuItem item) { //获取到的是listView里的条目信息 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.mi1: Toast.makeText(this, "已发送" + info.id, Toast.LENGTH_SHORT).show(); break; case R.id.mi2: Toast.makeText(this, "正在删除" + info.id, Toast.LENGTH_SHORT).show(); break; default: return super.onContextItemSelected(item); } return true; }其中我们可以通过item.getMenuInfo来获取item所对应的ListView里条目的信息,其中info.id即就是listView里的position
Step4:
去res/menu/xxx.xml里静态构建菜单,当然啦,动态的话是不需要这一步的
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <group android:id="@+id/group1"> <item android:id="@+id/mi1" android:title="发送"> <!--ContextMenu的嵌套,点击进去之后又是一个ContextMenu--> <menu> <item android:id="@+id/mi_display_setting" android:title="发送邮件" android:icon="@mipmap/ic_launcher" /> <item android:id="@+id/mi_network_setting" android:title="发送短信"/> <!-- 别的菜单项 --> </menu> </item> <item android:id="@+id/mi2" android:title="删除"/> </group> </menu>
***********有一个问题就是我暂时还没发现修改ContextMenu窗体的大小风格,知道的博友还请指教***********
标签:contextmenu 详解
原文地址:http://blog.csdn.net/bob1993_dev/article/details/46334157