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详解的更多相关文章

  1. Android开发–Intent-filter属性详解

    Android开发–Intent-filter属性详解 2011年05月09日 ⁄ Andriod ⁄ 暂无评论 ⁄ 被围观 1,396 views+ 如果一个 Intent 请求在一片数据上执行一个 ...

  2. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  3. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  4. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  5. android bundle存放数据详解

    转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...

  6. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  7. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  8. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现   2.纯代 ...

  9. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

随机推荐

  1. [HAOI 2008]糖果传递

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...

  2. [HNOI2012]与非

    题目描述 NAND(与非)是一种二元逻辑运算,其运算结果为真当且仅当两个输入的布尔值不全为真.NAND运算的真值表如下(1表示真,0表示假): 两个非负整数的NAND是指将它们表示成二进制数,再在对应 ...

  3. epoll源码分析(转)

    在create后会创建eventpoll对象保存在一个匿名fd的file struct的private指针中,然后进程睡在等待队列上面. 对于等待的fd,通过poll机制在准备好之后会调用相应的cal ...

  4. bzoj 3672: [Noi2014]购票

    Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...

  5. 【Codeforces Round #431 (Div. 1) D.Shake It!】

    ·最小割和组合数放在了一起,产生了这道题目. 英文题,述大意:     一张初始化为仅有一个起点0,一个终点1和一条边的图.输入n,m表示n次操作(1<=n,m<=50),每次操作是任选一 ...

  6. linux内核input子系统解析【转】

    转自:http://emb.hqyj.com/Column/Column289.htm 时间:2017-01-04作者:华清远见 Android.X windows.qt等众多应用对于linux系统中 ...

  7. 【转载】 HTTP 中 GET 与 POST 的区别

    HTTP 中 GET 与 POST 的区别   GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通 ...

  8. 图像融合之拉普拉斯融合(laplacian blending)

    一.拉普拉斯融合基本步骤 1. 两幅图像L,R,以及二值掩模mask,给定金字塔层数level. 2. 分别根据L,R构建其对应的拉普拉斯残差金字塔(层数为level),并保留高斯金字塔下采样最顶端的 ...

  9. Mysql锁机制--间隙锁的危害

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS employee; CREATE TABLE IF NOT EXISTS ...

  10. You And Me 不见不散!

    泰戈尔说: 有一个夜晚,我烧毁了所有的记忆, 从此我的梦就透明了: 有个早晨我扔掉了所有的昨天, 从此我的脚步就轻盈了! 越过山丘,才发现无人等候! 有段话最近很流行:20多岁的你,迷茫又着急,你想要 ...