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. [BZOJ 4403]序列统计

    Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第一行包含一个整数T,表示数据组 ...

  2. [USACO09DEC]牛收费路径Cow Toll Paths

    跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费. 农场中 ...

  3. UVA - 11107:Life Forms

    后缀数组height+二分 #include<cstdio> #include<cstdlib> #include<algorithm> #include<c ...

  4. UVA11552:Fewest Flops

    发现如果只有一块就是种类的数目,也就是同种放在一起, 再考虑多块,如果违背的上面的规律,可以发现不会更优, 于是问题就是求在满足同种类放在一起的前提下,尽量使得相邻块的两端一模一样 然后dp一下就可以 ...

  5. ●BZOJ 3672 [Noi2014]购票

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3672 题解: 斜率优化DP,点分治(树上CDQ分治...) 这里有一个没有距离限制的简单版: ...

  6. 2015 多校联赛 ——HDU5305(搜索)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  7. spring 自定义事件发布及监听(简单实例)

    前言: Spring的AppilcaitionContext能够发布事件和注册相对应的事件监听器,因此,它有一套完整的事件发布和监听机制. 流程分析: 在一个完整的事件体系中,除了事件和监听器以外,还 ...

  8. 深入以太坊智能合约 ABI

    开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...

  9. JAVA的Date类与Calendar类(常用方法)

    http://blog.csdn.net/xiaopihai86/article/details/50827945 1.用Java.util.Calender来实现      Calendar cal ...

  10. 39. Combination Sum(medium, backtrack 的经典应用, 重要)

    Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique c ...