Android 菜单, option menu 和 context menu (右键菜单)

1. 菜单分为option menu 和 context menu (右键菜单)

创建菜单的方式有两种: 通过xml配置  和  代码生成

菜单的样式 4.0 后有变化,如果要回到之前2.x的样式可以配置activity的属性 android:theme="@android:style/Theme"

4.0后的菜单不能设置icon , 可以通过实例中的方法设置

option menu 只需创建 和 监听事件, context在创建之前需要在某一个view上注册


MainActivity.java

package com.example.menu_actionbar;

import java.lang.reflect.Method;
import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.Toast;

public class MainActivity extends ListActivity {

	private String[] colors = {"red", "green", "blue"};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, colors);
		setListAdapter(adapter);
		
		//ContextMenu 右键菜单效果, 使用前先注册到对应的View, 一般在ListView上使用
		registerForContextMenu(getListView());
	}
	
	//Context Menu, 创建 和 事件响应
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		getMenuInflater().inflate(R.menu.main, menu);
		setIconEnable(menu, true);
		super.onCreateContextMenu(menu, v, menuInfo);
	}
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		//info知道是点击的哪个listview
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
		switch (item.getItemId()) {
		case R.id.menu_settings:
			Toast.makeText(this, "click setting item, "+info.position, Toast.LENGTH_SHORT).show();
			break;
		case R.id.menu_call:
			Toast.makeText(this, "click call item"+info.position, Toast.LENGTH_SHORT).show();
			break;
		case R.id.menu_edit:
			Toast.makeText(this, "click edit item"+info.position, Toast.LENGTH_SHORT).show();
			break;
		default:
			break;
		}
		return super.onContextItemSelected(item);
	}
	
	//OptionsMenu
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		//方式一: 通过xml配置menu
		getMenuInflater().inflate(R.menu.main, menu);
		setIconEnable(menu, true);
		
		//方式二: 代码添加
		//menu.add(0, 1, Menu.NONE, "Send");
		//SubMenu subMenu = menu.addSubMenu(0, 2, Menu.NONE, "Edit");
		//subMenu.add(1, 21, 1, "Edit1");
		//subMenu.add(1, 22, 2, "Edit2");
		
		//add 方法的参数
		//groupId,组别,用来划分itemid的。一般为Menu.NONE
		//itemId,ID。是menu识别编号,供识别menu用的,很重要
		//order,顺序。这个参数的大小决定菜单选项出现的先后顺序。顺序按照参数由小到大
		//title,显示文本
		
		return true;
	}

	//OptionsMenu item被选中的触发事件 
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
		return super.onOptionsItemSelected(item);
	}
	

	// 4.0 后不能设置icon的原因是 MenuBuilder中默认的setOptionalIconsVisible被设置false	
	private void setIconEnable(Menu menu, boolean enable)
    {
    	try 
    	{
			Class clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
			Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
			m.setAccessible(true);
			//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
			m.invoke(menu, enable);
		} catch (Exception e) 
		{
			e.printStackTrace();
		}
    }
	
	

}
res/menu/main.xml  菜单配置



    
         
    
        
        
            
            
        
        
    
    
    






你可能感兴趣的:(Android)