一、上下问菜单

  在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单。有点类似与Windows系统中的右键菜单。

二、上下文菜单的内容

  1、标题

  2、图标

  3、菜单项

  4、对应的菜单事件

三、OptionsMenu和ContentMenu的区别:

  1、OptionMenu对应的Activity,一个Activity只能拥有一个选项菜单。

  2、 ContentMenu对应的View,每个View都可以设置上下文菜单。

  3、一般情况下,上下文菜单常用于ListView或者GirdView。

  

四、如何实现ContentMenu:

  1、首先给View注册上下文菜单,registerForContextMenu();

  2、通过xml布局的方式添加菜单项,也可以通过代码的方式动态添加菜单项。

  3、设置菜单点击后的相应事件,onContextItemSelected();

五、代码实现

main.xml:放置一个ListView用来显示列表信息

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <ListView
android:id="@+id/lv_files"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView> </LinearLayout>

menu_layout.xml,自定义的菜单项内容,可以通过菜单中getMenuInflater方法获取定义好的xml菜单。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/menu_copy"
android:orderInCategory="100"
android:title="复制"
app:showAsAction="never" />
<item
android:id="@+id/menu_paste"
android:orderInCategory="100"
android:title="粘贴"
app:showAsAction="never" />
<item
android:id="@+id/menu_cut"
android:orderInCategory="100"
android:title="剪切"
app:showAsAction="never" />
<item
android:id="@+id/menu_rename"
android:orderInCategory="100"
android:title="重命名"
app:showAsAction="never" />
</menu>

main.java

package com.example.zhengcheng.contextmenudemo;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast; import java.util.ArrayList;
import java.util.zip.Inflater; public class MainActivity extends ActionBarActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadListView();
} ListView lv_files; private void LoadListView() { lv_files = (ListView) findViewById(R.id.lv_files);
//创建一个适配器,用来填充到ListView中。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, getArrayList());
//设置listView的适配器
lv_files.setAdapter(adapter);
//为listview注册上下文菜单
this.registerForContextMenu(lv_files);
} /**
* 创建上下文菜单,重写onCreateContextMenu方法
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("文件操作"); //设置上下问菜单的标题
menu.setHeaderIcon(R.mipmap.ic_launcher); //设置上下问菜单的图标 //动态添加菜单项
// menu.add(1,101,1,"复制");
// menu.add(1,102,1,"粘贴");
// menu.add(1,103,1,"剪切");
// menu.add(1,104,1,"删除");
// menu.add(1,105,1,"重命名"); //导入xml菜单内容
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_layout, menu);
} /**
* 设置上下问菜单内容的点击事件,重写onContextItemSelected方法
*/
@Override
public boolean onContextItemSelected(MenuItem item) {
//获取选中的ListView中的Item项
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); //给动态生成的菜单项添加事件
// switch (item.getItemId()) {
// case 101:
// Toast.makeText(this, "复制", Toast.LENGTH_SHORT).show();
// break;
// case 102:
// Toast.makeText(this, "粘贴", Toast.LENGTH_SHORT).show();
// break;
// case 103:
// Toast.makeText(this, "剪切", Toast.LENGTH_SHORT).show();
// break;
// case 104:
// Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show();
// break;
// case 105:
// Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show();
// break;
// } //给xml菜单项生成事件
switch (item.getItemId()){
case R.id.menu_copy:
//Toast.makeText(this, "xml_复制", Toast.LENGTH_SHORT).show();
Toast.makeText(this, info.toString() + "复制", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_cut:
Toast.makeText(this, "xml_剪切", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_paste:
Toast.makeText(this, "xml_粘贴", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_rename:
Toast.makeText(this, "xml_重命名", Toast.LENGTH_SHORT).show();
break;
} return super.onContextItemSelected(item);
} /**
* 获取数据,填充到ArrayAdapter的数据
*
* @return
*/
private ArrayList<String> getArrayList() {
ArrayList<String> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list.add("文件" + i);
}
return list;
}
}

Android学习(二十二)ContentMenu上下文菜单的更多相关文章

  1. Android学习(十二) ContentProvider

    一.ContentProvider简介       当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据, ...

  2. android 学习随笔十二(网络:使用异步HttpClient框架)

    使用异步HttpClient框架发送get.post请求 在https://github.com/ 搜索 asyn-http https://github.com/search?utf8=✓& ...

  3. Android学习路线(二十四)ActionBar Fragment运用最佳实践

    转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能

    在<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>教程中,我们介绍了如何使用“客服接口”,即在服务器后台,在任意时间向微信发送文本.图文.图片等不 ...

  5. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  6. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  7. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  8. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  9. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  10. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

随机推荐

  1. 当表名存在 点 的时候,EntityFramework的写法

    原文发布时间为:2011-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 需要在 Context 中,重写 DbContext 中的 OnModelCreating 方法 进行 mappi ...

  2. shortcut(NOIP模拟赛)(裸的排序)

    原题: Description Mirek有一条每天从他家去大学工作的最喜欢的路.这个路径由若干个部分组成,且每个部分是10米长的直线.每一个部分是直线连接(没有拐弯)上一个部分或垂直连接上一个部分. ...

  3. centos 安装使用smb

    http://blog.csdn.net/edu_enth/article/details/52964295

  4. v4l2读取摄像头程序流程解析【转】

    转自:https://my.oschina.net/u/1024767/blog/210801 v4l2 操作实际上就是 open() 设备, close() 设备,以及中间过程的 ioctl() 操 ...

  5. C/51单片机

    1.    串口也可以有多根线的,但是各线之间没有协调同步发送,而是各自是独自发送的.并口是同步发送,同步一次8位同时成功同时失败,类比事务. 2.    ASCII码的前32位是通讯预留的编码即使现 ...

  6. centos6.5 网卡服务开机自动启动

    今天打开许久没用的centos之后,发现网络服务器不可用,通过service network restart 依然无法使用,简单记录一下处理过程: 1.通过setup 命令查看Network conf ...

  7. 【Android开发日记】之入门篇(三)——Android目录结构

    本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些 ...

  8. gitlib 安装

    参考文件https://www.cnblogs.com/rslai/p/9109624.html

  9. 关于引用iframe的一点小说明

    有时候,在web页面中使用iframe,可以解决一些实际问题,比如跨域访问等……这篇文章的关键不是iframe适用于哪些场景?而是iframe间如何进行互通?所谓互通是指: 情况1:在任何一个页面中调 ...

  10. 性能优化之基础资源cpu&内存(JVM)

    本章主要介绍计算机的一些基础资源以及操作系统处理后的一些基础资源. 主要包括 cpu 内存 磁盘 网络 线程 本章会介绍这些资源的一些原理,介绍如何查看资源的数量,使用情况,对性能和整体计算机执行的一 ...