Android 菜单(ContextMenu)
Android 的ContextMenu,即上下文菜单。(类似电脑上的鼠标右键功能,选中某个元素,然后点右键,在弹出菜单上执行操作。)在手机上,通过长时间按住界面上的元素,就会出现事先设计好的上下文菜单。
主要用到的方法有:
// 创建显示上下文菜单 setOnCreateContextMenuListener //监听长按事件 setOnItemLongClickListener //监听普通按键事件 setOnItemClickListener //上下文菜单的选中事件 onContextItemSelected //监听上下文菜单关闭事件 onContextMenuClosed
示例(ListView上下文菜单)
|
|
效果图
main_list_view.xml 配置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/main_list_view_listview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
main_list_view_item.xml配置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout_Item" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="5dip" > <TextView android:id="@+id/main_list_view_item_item_text" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20px" android:layout_gravity="center" /> </LinearLayout>
Activity代码
package com.zhouzijing.android; import java.util.ArrayList; import com.zhouzijing.android.util.MenuEntity; import com.zhouzijing.android.util.SimpleAdapterUtil; import android.app.Activity; import android.content.Context; 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.view.View.OnCreateContextMenuListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class Menu2 extends Activity { final Context context = this; //定义1个ListView private ListView listView = null; //定义ListView需要显示的数据 private ArrayList<ArrayList<Object>> viewInfos = null; //定义上下文菜单 final private static int CONTEXT_MENU_EDIT = 0;//菜单[编辑]的编号 final private static int CONTEXT_MENU_SHARE = 1;//菜单[分享]的编号 final private static int CONTEXT_MENU_DELETE = 2;//菜单[删除]的编号 final private static int CONTEXT_MENU_CANCEL = 3;//菜单[取消]的编号 private int itemLongClickSelected = 0; private MenuEntity[] contextMenus = { new MenuEntity(0, CONTEXT_MENU_EDIT, 0, "编辑"), new MenuEntity(0, CONTEXT_MENU_SHARE, 1, "分享"), new MenuEntity(0, CONTEXT_MENU_DELETE, 2, "删除"), new MenuEntity(0, CONTEXT_MENU_CANCEL, 3, "取消"), }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_list_view); //初始化要显示的内容 initListViewInfos(); //显示ListView showListView(); //显示ListView的上下文菜单 showListViewContextMenu(); } /** * 初始化ListView需要显示的内容. */ public void initListViewInfos(){ viewInfos = new ArrayList<ArrayList<Object>>(); ArrayList<Object> countrys = new ArrayList<Object>(); countrys.add("Austria"); countrys.add("China"); countrys.add("Egypt"); countrys.add("France"); countrys.add("Ireland"); countrys.add("Japan"); countrys.add("Spain"); countrys.add("United Kingdom"); countrys.add("United States"); viewInfos.add(countrys); } /** * 从ListView显示内容中删除1条记录. */ public void removeItem(int index){ viewInfos.get(0).remove(index); } /** * 从ListView显示内容中读取1条记录 * @param index * @return */ public Object readItem(int index){ return viewInfos.get(0).get(index); } /** * 读取当前执行的菜单 * @param index * @return */ public CharSequence readContextMenu(int index){ for(int i=0;i<contextMenus.length;i++){ if(contextMenus[i].getItemId()==index) return contextMenus[i].getTitle(); } return ""; } /** * 显示ListView. */ public void showListView(){ final Context context = this; //定义适配器to参数 int[] to = {R.id.main_list_view_item_item_text}; int resource = R.layout.main_list_view_item; //生成适配器:使用自定义工具类 SimpleAdapterUtil.java来生成适配器 SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to); listView = (ListView)findViewById(R.id.main_list_view_listview); listView.setAdapter(simpleAdapter); } /** * 显示ListView的上下文菜单 */ public void showListViewContextMenu(){ //创建上下文菜单 listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle(readItem(itemLongClickSelected).toString()); MenuEntity menuEntity = null; for(int i=0;i<contextMenus.length;i++){ menuEntity = contextMenus[i]; menu.add(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle()); } } }); //监听列表项目的长按事件 listView.setOnItemLongClickListener(new OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { itemLongClickSelected = position; Toast.makeText(context,"item["+position+":"+readItem(itemLongClickSelected).toString()+"]被长时间点击了.",Toast.LENGTH_SHORT).show(); return false; } }); //监听列表项目的普通点击事件 listView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(context,"item["+position+":"+readItem(position).toString()+"]被点击了.",Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onContextItemSelected(MenuItem item) {//执行上下文菜单中的菜单 int itemId = item.getItemId(); Toast.makeText(context,"Context menu item["+itemId+":"+readContextMenu(itemId)+"] is Selected.",Toast.LENGTH_SHORT).show(); if(CONTEXT_MENU_DELETE==itemId){//删除 //当前选中的ListView中的item编号 int index = itemLongClickSelected; //在当前ListView中删除选中的元素 removeItem(index); //重新显示ListView showListView(); } return super.onContextItemSelected(item); } @Override public void onContextMenuClosed(Menu menu) {//关闭上下文菜单 Toast.makeText(context,"Context Menu is Closed.",Toast.LENGTH_SHORT).show(); super.onContextMenuClosed(menu); } }
备注:
private MenuEntity[] contextMenus = { new MenuEntity(0, CONTEXT_MENU_EDIT, 0, "编辑"), new MenuEntity(0, CONTEXT_MENU_SHARE, 1, "分享"), new MenuEntity(0, CONTEXT_MENU_DELETE, 2, "删除"), new MenuEntity(0, CONTEXT_MENU_CANCEL, 3, "取消"), };
参考 关于菜单基础属性的实体类
SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to);
参考 1个简单的SimpleAdapter工具类-SimpleAdapterUtil(版本二:数据格式为ArrayList<ArrayList<Object>>)
关于根据上下文菜单来获取当前选中的GridView(或ListView等)的元素
//OnCreateContextMenuListener gridPhoneBook.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { //获取上下文菜单点击的GridView中的元素 AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; int position = info.position; //设置上下文菜单的标题 PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position); menu.setHeaderTitle(phoneBook.getName()); //设置上下文菜单 MenuEntity menuEntity; for(int i=0;i<CONTEXT_MENUS.length;i++){ menuEntity = CONTEXT_MENUS[i]; menu.add(menuEntity.getGroupId(), menuEntity.getItemId() ,menuEntity.getOrder(),menuEntity.getTitle()); } } }); /** * 上下文菜单-具体菜单的执行操作. */ @Override public boolean onContextItemSelected(MenuItem item) { //获取选中的GridView的元素 AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); int position = info.position; PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position); //菜单ID int menuId = item.getItemId(); switch(menuId){ case CONTEXT_MENU_PHONE_BOOK_DELETE: doContextMenuOfDelete(phoneBook); break; } return super.onContextItemSelected(item); }