ContextMenu上下文菜单
2015-08-09 10:16
363 查看
android中长按按钮弹出上下文菜单,点击菜单项之后,产生点击事件。
ContextMenu对应的是View,每个View都可以设置上下文菜单;
一般情况下ContextMenu常用于ListView或者GridView。
添加上下文菜单内容onCreateContextMenu()
方法一:可以通过代码动态添加;
方法二:可以加载xml文件中的菜单项
设置菜单点击后响应事件onContextItemSelected()
这个小例子是要显示一个数组,我们就用ArrayAdapter,数组适配器,数据的数据类型<>是String类型的,数据的数据类型还可以是其他的包括对象类型的;
这段代码是创建一个数组适配器的代码,里面有三个参数:
第一个参数是上下文
第二个参数是android sdk中自己内置的一个布局,它里面只有一个TextView,这个参数是表明我们数组中每一条数据的布局是这个view,就是将每一条数据都显示在这个view上面;
第三个参数就是我们要显示的数据。listView会根据这三个参数,遍历adapterData里面的每一条数据,读出一条,显示到第二个参数对应的布局中,这样就形成了我们看到的listView.
MainActivity.java代码:
方法二,通过修改或添加menu.xml文件设置菜单项
修改menu.xml文件:
MainActivity.java代码:
ContextMenu与OptionMenu的区别:
OptionMenu对应的是activity,一个activity只能对应一个选项菜单;ContextMenu对应的是View,每个View都可以设置上下文菜单;
一般情况下ContextMenu常用于ListView或者GridView。
ContextMenu创建方法
首先给View注册上下文菜单registerForContextMenu()添加上下文菜单内容onCreateContextMenu()
方法一:可以通过代码动态添加;
方法二:可以加载xml文件中的菜单项
设置菜单点击后响应事件onContextItemSelected()
ArrayAdapter的使用
适配器的作用是数据和视图之间的桥梁;这个小例子是要显示一个数组,我们就用ArrayAdapter,数组适配器,数据的数据类型<>是String类型的,数据的数据类型还可以是其他的包括对象类型的;
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(ArrayListDemo.this,android.R.layout.simple_list_item_1, adapterData);
这段代码是创建一个数组适配器的代码,里面有三个参数:
第一个参数是上下文
第二个参数是android sdk中自己内置的一个布局,它里面只有一个TextView,这个参数是表明我们数组中每一条数据的布局是这个view,就是将每一条数据都显示在这个view上面;
第三个参数就是我们要显示的数据。listView会根据这三个参数,遍历adapterData里面的每一条数据,读出一条,显示到第二个参数对应的布局中,这样就形成了我们看到的listView.
实例代码
方法一,通过代码动态添加菜单项MainActivity.java代码:
package com.example.contextmenudemo; import java.util.ArrayList; import android.R.string; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showListView(); } /* * 设置ListView显示方法 */ public void showListView() { ListView listView=(ListView) findViewById(R.id.listView1); //通过ArrayAdapter设置ListView的显示内容,其第二个参数是当前ListView对应item的子布局是什么样的, //第三个参数传一个list,该list中存放我们要显示的数据 ArrayAdapter<String> adapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getData()); listView.setAdapter(adapter); this.registerForContextMenu(listView); } //重写方法onCreateContextMenu,创建上下文菜单,当长按item时,就会弹出上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub super.onCreateContextMenu(menu, v, menuInfo); //设置Menu显示内容 menu.setHeaderTitle("文件操作"); menu.setHeaderIcon(R.drawable.ic_launcher); menu.add(1, 1, 1, "复制");//设置菜单项 menu.add(1, 2, 1, "粘贴"); menu.add(1, 3, 1, "剪切"); menu.add(1, 4, 1, "重命名"); } /* * 重写方法onContextItemSelected,为每一个菜单项设置点击事件 * */ @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case 1: Toast.makeText(this, "点击了复制", Toast.LENGTH_SHORT).show(); break; case 2: Toast.makeText(this, "点击了粘贴", Toast.LENGTH_SHORT).show(); break; case 3: Toast.makeText(this, "点击了剪切", Toast.LENGTH_SHORT).show(); break; case 4: Toast.makeText(this, "点击了重命名", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } /* *构造ListView要显示的数据 */ private ArrayList<String> getData() { ArrayList<String> list=new ArrayList<String>(); for (int i = 0; i < 5; i++) { list.add("文件"+(i+1)); } return list; } }
方法二,通过修改或添加menu.xml文件设置菜单项
修改menu.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="com.example.contextmenudemo.MainActivity" > <item android:id="@+id/context_menu_item1" android:orderInCategory="100" android:title="复制" app:showAsAction="never"/> <item android:id="@+id/context_menu_item2" android:orderInCategory="100" android:title="粘贴" app:showAsAction="never"/> <item android:id="@+id/context_menu_item3" android:orderInCategory="100" android:title="剪切" app:showAsAction="never"/> <item android:id="@+id/context_menu_item4" android:orderInCategory="100" android:title="重命名" app:showAsAction="never"/> </menu>
MainActivity.java代码:
package com.example.contextmenudemo; import java.util.ArrayList; import android.R.string; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showListView(); } /* * 设置ListView显示方法 */ public void showListView() { ListView listView=(ListView) findViewById(R.id.listView1); //通过ArrayAdapter设置ListView的显示内容,其第二个参数是当前ListView对应item的子布局是什么样的, //第三个参数传一个list,该list中存放我们要显示的数据 ArrayAdapter<String> adapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getData()); listView.setAdapter(adapter); this.registerForContextMenu(listView); } //重写方法onCreateContextMenu,创建上下文菜单,当长按item时,就会弹出上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub super.onCreateContextMenu(menu, v, menuInfo); //设置Menu显示内容 menu.setHeaderTitle("文件操作"); menu.setHeaderIcon(R.drawable.ic_launcher); /* * 方法一:通过说使用Menu对象,调用add()方法设置菜单项 * menu.add(1, 1, 1, "复制"); * menu.add(1, 2, 1, "粘贴"); * menu.add(1, 3, 1, "剪切"); * menu.add(1, 4, 1, "重命名"); */ //方法二:通过MenuInflater方法,引入main.xml菜单 MenuInflater inflater=getMenuInflater(); inflater.inflate(R.menu.main, menu); } /* * 重写方法onContextItemSelected,为每一个菜单项设置点击事件 * */ @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.context_menu_item1: Toast.makeText(this, "点击了复制", Toast.LENGTH_SHORT).show(); break; case R.id.context_menu_item2: Toast.makeText(this, "点击了粘贴", Toast.LENGTH_SHORT).show(); break; case R.id.context_menu_item3: Toast.makeText(this, "点击了剪切", Toast.LENGTH_SHORT).show(); break; case R.id.context_menu_item4: Toast.makeText(this, "点击了重命名", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } /* *构造ListView要显示的数据 */ private ArrayList<String> getData() { ArrayList<String> list=new ArrayList<String>(); for (int i = 0; i < 5; i++) { list.add("文件"+(i+1)); } return list; } }
相关文章推荐
- 设计模式----代理模式
- MyEclipse 10 部署项目时报错,抛出java.lang.NullPointerException异常的解决方法
- Non-resolvable parent POM ['parent.relativePath]
- oc基础第三天-类方法、封装
- Python学习笔记
- ARC的概念和分类的概念
- HDU 1754 I Hate It 线段树
- jquery的post提交---$.post
- Android应用开发之所有动画使用详解
- SQL SERVER 2008 无法附加数据库的解决方法
- Linux 利用管道父子进程间传递数据
- Windows远程桌面技术和SPICE协议概述
- 如何查询注册表的值及 Powershell 应用
- 1044. Shopping in Mars (25)
- 【Java多线程】之四:Life Cycle of Thread
- house robber
- BestCoder Round #49 ($) HDOJ5340 Three Palindromes(暴力)
- seajs使用 - 模块化介绍
- DP问题之最优加法序列
- JQuery函数加载顺序