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. hy 的惩罚

    [问题描述] hy 抄题解又被老师抓住了,现在老师把他叫到了办公室. 老师要 hy 和他 玩一个游戏.如果 hy 输了,老师就要把他开除信息组:  游戏分为 k 轮.在游戏开始之前,老师会将 n 个由 ...

  2. 【NOIP2016TG】solution

    传送门:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C33 D1T1(toys) 题意:有n个小人, ...

  3. 使用rsync在windows(服务端)与linux(客户端)之间同步

    说明: 1.cwRsyncServer服务端 系统:Windows7 IP地址:192.168.0.110 2.Rsync客户端 系统:CentOS 6.7 IP地址:192.168.0.141 实现 ...

  4. 什么是Hash?

    什么是Hash? Hash中文翻译为散列,又成为"哈希",是一类函数的统称,其特点是定义域无限,值域有限.把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换 ...

  5. HTTPS介绍

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  6. Java多线程volatile和synchronized总结

    volatile是轻量级的synchronized,在多处理器(多线程)开发中保证了共享变量的"可见性".可见性表示当一个线程修改了一个共享变量时,另外一个线程能读到这个修改的值. ...

  7. js遍历 for-of

    for-of遍历 entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组.对于数组,键名就是索引值:对于 Set,键名与键值相同.Map 结构的 Iterator 接口,默认就是调 ...

  8. 【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群

    http://www.csdn.net/article/2014-11-06/2822529/3 大规模流量的网站架构,从来都是慢慢"成长"而来.而这个过程中,会遇到很多问题,在不 ...

  9. Linux中Mysql root用户看不到mysql库问题解决方式

    第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables &  ...

  10. FileOutputStream&FileInputStream&异常的使用

    FileOutputStream&FileInputStream&异常的使用 我们总觉得历史是极其遥远的东西,与我们并无关联,又觉得历史隐藏在图书馆的旧书之中. 然而,我们每个人都有真 ...