Android上下文菜单ContentView详解
ContentView介绍
上下文菜单继承了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)方法。
另一个值得注意的就是上图中的ContextMenuInfo,该类的对象被传入onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
第一种实现方法
1.首先通过registerForContextMenu方法为view注册ContentView。
2.复写onCreateContextMenu和onContextItemSelected方法来实现菜单以及单击事件。
代码举例:
//注册上下文菜单
publicclass NiceActivity extends ListActivity
this.registerForContextMenu(getListView());
//生成上下文菜单
@Override
publicvoid onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
Log.v(TAG, "populate context menu");
// set context menu title
menu.setHeaderTitle("文件操作");
// add context menu item
menu.add(0, 1, Menu.NONE, "nice");
menu.add(0, 2, Menu.NONE, "hello");
menu.add(0, 3, Menu.NONE, "world");
menu.add(0, 4, Menu.NONE, "liupeng");
}
//响应上下文菜单项
@Override
publicboolean onContextItemSelected(MenuItem item) {
// 得到当前被选中的item信息
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
Log.v(TAG, "context item seleted ID="+ menuInfo.id);
switch(item.getItemId()) {
case1:
// do something
break;
case2:
// do something
break;
case3:
// do something
break;
case4:
// do something
break;
default:
returnsuper.onContextItemSelected(item);
}
returntrue;
}
第二种方式
1.设置上下文菜单监听事件,并且实现监听接口,代码如下:
private GridView gridMyScrawl;
gridMyScrawl.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add(0, 0, 0, R.string.share);
menu.add(0, 1, 0, R.string.delete);
menu.add(0, 2, 0, R.string.cancel);
}
});
2.复写onContextItemSelected方法,注意这个方法的复写和上面的接口是对应的。
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
String fileLocation = null;
switch (item.getItemId()) {
case 0: //cpusctech,share
String extraPath1 = Environment.getExternalStorageDirectory().toString();
String extraPath2 = "assets/artshow/Papercut Arts/";
if(filePage == 1) //scrawl
{
fileLocation = extraPath1 + CutWorks + fileName;
}
else if(filePage == 2)
{
fileLocation = extraPath1 + WorldWorks + fileName;
}
Intent shareIntent=new Intent(Intent.ACTION_SEND);
File file1=new File(fileLocation);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file1));
shareIntent.putExtra(Intent.EXTRA_TEXT, R.string.finishTips4);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getString(R.string.shareTips)));
break;
case 1:
// 删除
if(filePage == 3)
Toast.makeText(MultiGridPage.this, "亲!我哪里不好看,告诉我,我改还不行么 %>_<%", Toast.LENGTH_SHORT).show();
else
{
//获得图片在SD卡上的存放路径
String extraPath = Environment.getExternalStorageDirectory().toString();
if(filePage == 1) //scrawl
{
fileLocation = extraPath + CutWorks + fileName;
}
else if(filePage == 2)
{
fileLocation = extraPath + WorldWorks + fileName;
}
else
Toast.makeText(MultiGridPage.this, "空位置", Toast.LENGTH_SHORT).show();
//删除SD卡上的数据
File file = new File(fileLocation);
//System.out.println("删除:" + fileLocation);
if(!file.exists())
{
Toast.makeText(MultiGridPage.this, R.string.deleteTips, Toast.LENGTH_SHORT).show();
}
file.delete();
//重新绑定数据
if(filePage == 1) //scrawl
{
//ImageSource _is = new ImageSource(this);
is = new ImageSource(this);
viewPager.removeView(gridMyScrawl);
myScrawlAdapter = new GridImageAdapter(this, dm, getString(R.string.my_scrawl), is);
gridMyScrawl.setAdapter(myScrawlAdapter);
}
else if(filePage == 2)
{
//ImageSource _is = new ImageSource(this);
is = new ImageSource(this);
viewPager.removeView(gridMyPapercut);
myPapercutAdapter = new GridImageAdapter(this, dm, getString(R.string.my_papercut), is);//新建一个网格图片适应器,其实用ListView控件更合适
gridMyPapercut.setAdapter(myPapercutAdapter);//设置自适应
}
}
break;
case 2: // 取消
break;
default:
break;
}
return super.onContextItemSelected(item);
}
效果图如下:
Android上下文菜单ContentView详解的更多相关文章
- Android开发–Intent-filter属性详解
Android开发–Intent-filter属性详解 2011年05月09日 ⁄ Andriod ⁄ 暂无评论 ⁄ 被围观 1,396 views+ 如果一个 Intent 请求在一片数据上执行一个 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- ANDROID L——Material Design详解(UI控件)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
- android bundle存放数据详解
转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...
- Cordova 打包 Android release app 过程详解
Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代 ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
随机推荐
- 【网络流】【BZOJ1061】【NOI2008】志愿者招募
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 题意:问你如何购买志愿者使得满足题意的总费用最小. 解题思路:首先,由于志愿者存在的 ...
- ●BZOJ 2007 NOI 2010 海拔
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2007 题解: 网络流.最小割.对偶图 奇妙的题 ~ 种种原因导致了高度要么为 0,要么为 1 ...
- bzoj 5000: OI树
Description 几天之后小跳蚤即将结束自己在lydsy星球上的旅行.这时,lydsy人却发现他们的超空间传送装置的能量早在小跳 蚤通过石板来到lydsy星球时就已经消耗光了.这时,小跳蚤了解到 ...
- [bzoj1566][NOI2009]管道取珠
来自FallDream的博客,未经允许,请勿转载,谢谢. n<=500 神题...... 发现这个平方可以看作两个序列相同的对数 然后就可以表示状态了. f[i][j][k]表示两个序列各选了 ...
- Codeforces Round#402(Div.1)掉分记+题解
哎,今天第一次打div1 感觉头脑很不清醒... 看到第一题就蒙了,想了好久,怎么乱dp,倒过来插之类的...突然发现不就是一道sb二分吗.....sb二分看了二十分钟........ 然后第二题看了 ...
- springboot集成redis(mybatis、分布式session)
安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...
- Linux下用程序实现统计cpu和内存的利用率
Linux下没有直接可以调用系统函数知道CPU占用和内存占用.那么如何知道CPU和内存信息呢.只有通过proc伪文件系统来实现. proc伪文件就不介绍了,只说其中4个文件.一个是/proc/stat ...
- Mybatis中 collection 和 association 的区别
public class A{ private B b1; private List<B> b2;} 在映射b1属性时用association标签,(一对一的关系) 映射b2时用colle ...
- Gradle入门--基本配置
Gradle配置: Gradle构建脚本 build.gradle Gradle属性文件 gradle.properties Gradle设置文件 settings.gradle build.grad ...
- Nginx+tomcat配置集群负载均衡
开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...