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. [SDOI2010]古代猪文

    题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片 ...

  2. ●Joyoi 绿豆蛙的归宿

    题链: http://www.joyoi.cn/problem/tyvj-1933题解: 期望dp,拓扑序 定义dp[i]表示从i点到N点的期望距离. 令cnt[u]表示u的出度. 显然$$dp[u] ...

  3. Codeforces Round #402 (Div. 1)

    A题卡壳了,往离线倒着加那方面想了会儿,后来才发现方向错了,二十多分钟才过掉,过了B后做D,想法好像有点问题,最后只过两题,掉分了,差一点回紫. AC:AB Rank:173 Rating:2227- ...

  4. hdu5634 BestCoder Round #73 (div.1)

    Rikka with Phi  Accepts: 5  Submissions: 66  Time Limit: 16000/8000 MS (Java/Others)  Memory Limit: ...

  5. Ubuntu 16.04 Vim安装及配置

    安装VIM 默认已经安装了VIM-tiny acewu@acewu-computer:~$ locate vi | grep 'vi$' |xargs ls -al lrwxrwxrwx 1 root ...

  6. Python【第四课】 装饰器

    本篇内容 什么是装饰器 装饰器需要遵循的原则 实现装饰器的知识储备 高阶函数 函数嵌套 闭包函数 无参函数 装饰器示例 1.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本 ...

  7. 假定某系统提供硬件的访管指令(例如形式:“svc n”),为了实现系统调用,系统设计者应做哪些工作?用户又如如何请求操作系统服务?

    工作: 1.  编写并调试好能实现各种功能的例行子程序. 2.  编写并调试好访管中断处理程序. 3.  构造例行子程序入口地址表. 在用户程序中,需要请求操作系统服务的地方安排一条系统调用.这样,当 ...

  8. Cisco 关闭命令同步提示信息

    Router(config)#no logging console 如果你通过console连接,使用第一条Router(config)#no logging monitor 如果通过telnet,s ...

  9. Java常量初始化后不会再去重新获取

    Java虚拟机编译机制:更改常量部分 最近一个Java项目中需要修改一个静态常量的值,本地修改编译以后调试正常,然后把对应的entity类的class文件上传到服务器对应的目录以后系统依旧我行我素,各 ...

  10. Python小代码_8_今天是今年的第几天

    import time date = time.localtime() print(date) #time.struct_time(tm_year=2018, tm_mon=2, tm_mday=24 ...