Android学习(二十二)ContentMenu上下文菜单
一、上下问菜单
在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单。有点类似与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上下文菜单的更多相关文章
- Android学习(十二) ContentProvider
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据, ...
- android 学习随笔十二(网络:使用异步HttpClient框架)
使用异步HttpClient框架发送get.post请求 在https://github.com/ 搜索 asyn-http https://github.com/search?utf8=✓& ...
- Android学习路线(二十四)ActionBar Fragment运用最佳实践
转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能
在<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>教程中,我们介绍了如何使用“客服接口”,即在服务器后台,在任意时间向微信发送文本.图文.图片等不 ...
- 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter
目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- Tensorflow深度学习之十二:基础图像处理之二
Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像: ...
随机推荐
- 理解S12(X)架构中的地址映射方案
目录 1. 介绍 2. CPU 本地地址 3. 分页窗口 4. 内存页 5. 控制各个对象在内存中放置的位置 介绍 在一个S12或S12X架构中,很有必要分清楚两种类型的内存地址:banked和non ...
- jquery判断ie与使用ie来判断ie,推荐ie样式块
用jquery来判断浏览器类型,如果只是仅仅为了判断浏览器的类型而使用该方法,那么不建议使用,只是在你已经使用了jquery才建议使用,因为没必要因为这么小的一个功能就加载那么大的类库吧 Jquery ...
- 使用 padding-bottom 设置高度基于宽度的自适应
我们在做移动端列表,通常会做到图文列表,列表是自适应的.当列表中有图片,图片的宽度是随着列表宽的变化而变化,我们为了在图片宽度变化的时候做到图片的不变形,所有采用以下办法. 本文章只讲语法 html ...
- EVERYTHING 1.3.4参数
命令行参数 操作符: space 与 (AND) | 或 (OR) ! 非 (NOT) < > 分组 " &quo ...
- MFC 实现打印机打印功能
Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这 ...
- 【linux高级程序设计】(第十一章)System V进程间通信 3
信号量通信机制 可以看到,跟消息队列类似,也是包括两个结构. int semget (key_t __key, int __nsems, int __semflg) : 创建信号量集合 第一个参数:f ...
- 「kuangbin带你飞」专题十五 数位DP
传送门 A.CodeForces - 55D Beautiful numbers 题意 一个正整数是 漂亮数 ,当且仅当它能够被自身的各非零数字整除.我们不必与之争辩,只需计算给定范围中有多少个漂亮数 ...
- FZU-2267 The Bigger the Better(字符串,模拟)
Problem 2267 The Bigger the Better Accept: 132 Submit: 935Time Limit: 1500 mSec Memory Limit ...
- Xamarin XAML语言教程Progress属性设置进度条进度
Xamarin XAML语言教程Progress属性设置进度条进度 在图12.19~12.21中我们看到的是没有实现加载的进度条,即进度条的当前进度为0,如果开发者想要修改当前进度,可以使用两种方式: ...
- Closest Binary Search Tree Value -- LeetCode
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...