Android 菜单(ContextMenu)

Android 菜单(ContextMenu)

 

Android 的ContextMenu,即上下文菜单。(类似电脑上的鼠标右键功能,选中某个元素,然后点右键,在弹出菜单上执行操作。)在手机上,通过长时间按住界面上的元素,就会出现事先设计好的上下文菜单。

 

主要用到的方法有:

// 创建显示上下文菜单
setOnCreateContextMenuListener

//监听长按事件
setOnItemLongClickListener

//监听普通按键事件
setOnItemClickListener

//上下文菜单的选中事件
onContextItemSelected

//监听上下文菜单关闭事件
onContextMenuClosed
 

 


示例(ListView上下文菜单)

 


Android 菜单(ContextMenu)
 

Android 菜单(ContextMenu)
 

效果图

 

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);
	}
 

 

 

 

 

 

 

你可能感兴趣的:(contextMenu)