一、上下问菜单

  在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单。有点类似与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. 【原创】Linux环境下的图形系统和AMD R600显卡编程(3)——AMD显卡简介

    早期的显卡仅用于显示,后来显卡中加入了2D加速部件,这些部件用于做拷屏,画点,画线等操作.随着游戏.三维模拟以及科学计算可视化等需要,对3D的需求逐渐增加,早期图形绘制工作由CPU来完成,要达到真实感 ...

  2. Linux高端内存映射(上)【转】

    转自:http://blog.csdn.net/vanbreaker/article/details/7579941 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 高端内 ...

  3. 华为上机测试题(求亮灯数量-java)

    PS:自己写的,自测试OK,供大家参考. /* 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.…n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着.有n个学 ...

  4. react setState里的作用域

    从接触racet开始,我们就认识了setState,它是对全局变量进去更新的一个重要方法, 不仅可以更新数据,还能在更新后执行方法时直接调用刚刚更新的数据 今天碰到的问题就在于它的作用域的先后问题 先 ...

  5. (18)PL/SQL

    PL/SQL(Procedure Language/SQL) PL/SQL是Oracle对sql语言的过程化扩展---指在sql命令语言中增加了过程处理语句(如分支.循环等),使sql语言具有过程处理 ...

  6. Codeforces Round #447 (Div. 2) A. QAQ【三重暴力枚举】

    A. QAQ time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  7. BZOJ 4589 Hard Nim(FWT加速DP)

    题目链接  Hard Nim 设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数 那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数 ...

  8. mysql查询含有指定字段的所有表

    SELECT * FROM information_schema.columns WHERE column_name='userId'; TABLE_SCHEMA字段为db的名称(所属的数据库),字段 ...

  9. 线段树【SP1043】GSS1 - Can you answer these queries I

    Description 给出了序列\(A_1,A_2,-,A_n\). \(a_i \leq 15007,1 \leq n \leq 50000\).查询定义如下: 查询\((x,y)=max{a_i ...

  10. ACM的奇计淫巧系列

    突然想写个系列,算是总结总结集训中遇到的各种黑科技吧,这是目录 ACM的奇计淫巧_输入挂 ACM的奇计淫巧_扩栈C++/G++ ACM的奇计淫巧_bitset优化