Android第五讲--Menu

Android系统里面有3种类型的菜单:options menucontext menusub menuoptions menucontext menu是并列关系,他们下面可以有子菜单sub menu,但sub menu下不能再有子菜单,所以Android最多只能有两级菜单。

options menuMenu键就会显示,用于当前的Activity

它包括两种菜单项:

因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menuicon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项。

而多于6的菜单项会以“more” icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样。

Activity里面,一般通过以下函数来使用options menu

Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用。

Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用。

Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。

Java代码:

public class MainActivity extends Activity {
	private EditText et;

	static final private int MI1 = Menu.FIRST;
	static final private int MI2 = Menu.FIRST + 1;
	static final private int MI3 = Menu.FIRST + 2;
	static final private int MI4 = Menu.FIRST + 3;
	static final private int MI5 = Menu.FIRST + 4;
	static final private int MI6 = Menu.FIRST + 5;
	static final private int MI7 = Menu.FIRST + 6;
	static final private int MI8 = Menu.FIRST + 7;
	static final private int MI9 = Menu.FIRST + 8;
	static final private int MI10 = Menu.FIRST + 9;
	static final private int MI11 = Menu.FIRST + 10;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		et = (EditText) findViewById(R.id.tvSubMenu);
		registerForContextMenu(et);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuItem item2 = menu.add(0, MI2, Menu.NONE, R.string.item2); // 第一个参数是组ID,第三个参数是菜单项的顺序位置
		MenuItem item3 = menu.add(0, MI3, Menu.NONE, R.string.item3);
		MenuItem item4 = menu.add(0, MI4, Menu.NONE, R.string.item4);
		MenuItem item5 = menu.add(0, MI5, Menu.NONE, R.string.item5);
		MenuItem item6 = menu.add(0, MI6, Menu.NONE, R.string.item6);
		MenuItem item7 = menu.add(0, MI7, Menu.NONE, R.string.item7);
		//设置简称
		item4.setTitleCondensed("Short Title");
		// 分配图标
		item3.setIcon(R.drawable.add_new_item);
		// 分配快捷方式
		item3.setShortcut('0', 'a'); // 如果使用数字键盘就是0,如果使用全键盘就是a
		//菜单单项单击监听器,但是不鼓励这样做,菜单项应被onOptionsItemSelected处理
		item5.setOnMenuItemClickListener(new OnMenuItemClickListener(){

			public boolean onMenuItemClick(MenuItem arg0) {
				// TODO Auto-generated method stub
				et.setText("Orisun");
				return false;
			}
			
		});
		//当单击一个事件菜单后,该事件既没有被MenuItemClickListener处理,也没有被OptionsItemSelected处理,就会触发分配给这个菜单项的Intent.
		item6.setIntent(new Intent(this,SecActivity.class));
		return true;
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		super.onOptionsItemSelected(item);
		switch (item.getItemId()) {
		case MI3:
			Toast.makeText(getApplicationContext(),
					"You choose Menu Item 3", Toast.LENGTH_SHORT).show();
		default:break;
		}
		return false;
	}
	//每次显示菜单的时候会调用onPrepareOptionsMenu,根据程序的运行状态,可以对菜单进行动态的更改,可以动态地启用/禁用每一个菜单项
	@Override
	public boolean onPrepareOptionsMenu(Menu menu){
		super.onPrepareOptionsMenu(menu);
		if(et.getText().toString()!=""){
			MenuItem menuItem=menu.findItem(MI3);
			menuItem.setIcon(R.drawable.remove_item);
		}
		return true;
	}
}

 sub menu

不支持icon

Java代码:

//options menu里面增加一个子菜单

	//在options menu里面增加一个子菜单
	public boolean onCreateOptionsMenu(Menu menu) {
		SubMenu subMenu = menu.addSubMenu(0,0,Menu.NONE,"SubMenu");
		subMenu.setHeaderIcon(R.drawable.icon);
		subMenu.setIcon(R.drawable.icon);
		//为子菜单添加一个菜单项
		MenuItem summenuItem=subMenu.add(0,0,Menu.NONE,”Submenu Item”);

		//.......
	}


点击More之后就会显示 expanded menu

 context menu 要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。

这类型的菜单不支持icon和快捷键!

Activity里面,一般通过以下函数来使用context menu

Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。

Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。

Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。

Java代码:

public void onCreate(Bundle savedInstanceState) {
	//......
	//为一个View注册一个上下文菜单
	registerForContextMenu(et);
}
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		menu.add(1, MI8, Menu.NONE, "item 1").setCheckable(true)
				.setChecked(false);
		menu.add(1, MI11, Menu.NONE, "item 3").setCheckable(true)
				.setChecked(true);
		//注意MI8,MI11和MI9,MI10的groupID不一样了
		int groupId = 0;
		int menuItemOrder = Menu.NONE;

		menu.add(groupId, MI9, menuItemOrder, "Item 1 in group");
		menu.add(groupId, MI10, menuItemOrder, "Item 2 in group").setChecked(
				true);
		//函数原型setGroupCheckable(int group, boolean checkable,boolean exclusive)
		menu.setGroupCheckable(groupId, true, true);// 这句话要写在groupitem的最后。
						
		//为context menu添加子菜单
		SubMenu subMenu2 = menu.addSubMenu("Sub Menu 1");
		subMenu2.add("Sub Menu Item").setOnMenuItemClickListener(
				new MenuItem.OnMenuItemClickListener() {

					public boolean onMenuItemClick(MenuItem item) {
						Toast.makeText(getApplicationContext(),
								"Sub Menu Item Selected", Toast.LENGTH_SHORT)
								.show();
						return false;
					}
				});
		
	}
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		super.onContextItemSelected(item);
		switch (item.getItemId()) {
		case MI9:
			Toast.makeText(getApplicationContext(),
					"You choose Item 1 in group", Toast.LENGTH_SHORT).show();		
		default:break;
		}
		return false;
	}

xml形式的menu定义及应用
以上述的三种类型的menu都能够定义为xml资源,但需要手动地使用MenuInflater来得到Menu对象的引用。
/res/menu/contextmenu.xml
View Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item1"
android:title
="item1"
android:icon
="@drawable/icon"
android:checkable
="true"
android:checked
="false"/>
<group android:id="@+id/group1"
android:checkableBehavior
="single">
<item android:id="@+id/group_item1"
android:title
="Item 1 in group"/>
<item android:id="@+id/group_item2"
android:title
="Item 2 in group"
android:checked
="true"/>
</group>
<item android:id="@+id/submenu"
android:title
="Sub Menu">
<menu>
<item android:id="@+id/submenuitem"
android:title
="Sub Menu Item"/>
</menu>
</item>
<item android:id="@+id/item3"
android:title
="item3"
android:checkable
="true"
android:checked
="true"/>
</menu>
注意上面代码中我们为item1设置了icon
android:icon="@drawable/icon"
由于不支持icon,所以该语句不会报错,只是运行时不会显示icon
Java代码
View Code
public class SecActivity extends Activity{
private EditText et;
@Override
public void onCreate(Bundle context){
super.onCreate(context);
setContentView(R.layout.sec);
et
=(EditText)findViewById(R.id.tvSubMenu);
registerForContextMenu(et);
}
@Override
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.contextmenu, menu);
}
}

长按EditText就会出现ContextMenu,点击Sub Menu就会出现右边这个图片。


posted @ 2011-02-20 11:14  张朝阳  阅读(3567)  评论(0编辑  收藏  举报