Android之Menu

        今天继续Android学习之旅之Menu的记录。主要分为三个部分:1.选项菜单OptionMenu;2.上下文菜单ContextMenu;3.子菜单SubMenu;

        1.选项菜单OptionMenu;

        只需要重写onCreateOptionsMenu方法,在其中写添加菜单的逻辑:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	menu.add(Menu.NONE, Menu.FIRST + 1, 1, "增加").setIcon(R.drawable.add);
	menu.add(Menu.NONE, Menu.FIRST + 2, 2, "删除").setIcon(R.drawable.delete);
	menu.add(Menu.NONE, Menu.FIRST + 3, 3, "修改").setIcon(R.drawable.edit);
	menu.add(Menu.NONE, Menu.FIRST + 4, 4, "保存").setIcon(R.drawable.save);

	return true;
}
        然后重写菜单项点击方法onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	case Menu.FIRST + 1:
		Toast.makeText(OptionMenuActivity.this, "选择的是新增菜单",
				Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 2:
		Toast.makeText(OptionMenuActivity.this, "选择的是删除菜单",
				Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 3:
		Toast.makeText(OptionMenuActivity.this, "选择的是编辑菜单",
				Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 4:
		Toast.makeText(OptionMenuActivity.this, "选择的是保存菜单",
				Toast.LENGTH_LONG).show();
		break;
	}
	return false;
}
        运行截图如下:

Android之Menu_第1张图片

        当然菜单信息还可以写到XML文件中,在res/menu/下新建optionmenu_config.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/item1"
        android:icon="@drawable/add"
        android:title="添加"/>
    <item
        android:id="@+id/item2"
        android:icon="@drawable/delete"
        android:title="删除"/>
    <item
        android:id="@+id/item3"
        android:icon="@drawable/edit"
        android:title="编辑"/>
    <item
        android:id="@+id/item4"
        android:icon="@drawable/save"
        android:title="保存"/>
</menu>
        此时的创建菜单的方法onCreateOptionsMenu如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	super.getMenuInflater().inflate(R.menu.optionmenu_config, menu);
	return true;
}
        注意选择项的方法onOptionsItemSelected也要做点修改( case分支值需要变,注意跟原来比较):

@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	case R.id.item1:
		Toast.makeText(this, "选择的是新增菜单", Toast.LENGTH_LONG).show();
		break;
	case R.id.item2:
		Toast.makeText(this, "选择的是删除菜单", Toast.LENGTH_LONG).show();
		break;
	case R.id.item3:
		Toast.makeText(this, "选择的是编辑菜单", Toast.LENGTH_LONG).show();
		break;
	case R.id.item4:
		Toast.makeText(this, "选择的是保存菜单", Toast.LENGTH_LONG).show();
		break;
	default:
		Toast.makeText(this, "选择了菜单" + item.getTitle(), Toast.LENGTH_LONG)
				.show();
		break;
	}
	return false;
}
        这个错误找了好久,直到加了个default分支才发现这个错误,所以用switch时写default也是一个好的习惯;

        2.上下文菜单ContextMenu;

        在Android中用户通过长按操作打开某些操作的菜单就是上下文菜单,本例以ListView为例。
首先需要注册上下文菜单,在初始化时调用registerForContextMenu方法注册。然后跟选项菜单类似,重载onCreateContextMenu以添加上下文菜单,代码如下:

@Override
public void onCreateContextMenu(ContextMenu menu, View view,
		ContextMenu.ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, view, menuInfo);
	menu.setHeaderTitle("操作城市");
	menu.add(Menu.NONE,Menu.FIRST+1,1,"查看城市信息");
	menu.add(Menu.NONE,Menu.FIRST+2,2,"添加城市信息");
	menu.add(Menu.NONE,Menu.FIRST+3,3,"编辑城市信息");
	menu.add(Menu.NONE,Menu.FIRST+4,4,"删除城市信息");
}
        然后重载点击方法onContextItemSelected:

@Override
public boolean onContextItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	case Menu.FIRST + 1:
		Toast.makeText(this, "选择的是查看城市信息菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 2:
		Toast.makeText(this, "选择的是添加城市信息菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 3:
		Toast.makeText(this, "选择的是编辑城市信息菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 4:
		Toast.makeText(this, "选择的是删除城市信息菜单", Toast.LENGTH_LONG).show();
		break;
	}
	return false;
}
        运行截图如下:

Android之Menu_第2张图片

        这里菜单信息也可以写到XML文件中,方法跟选项菜单里一样,就不复述了。

        3.子菜单SubMenu;

        每一个菜单还可以有子菜单,此时就需要SubMenu。同选项菜单,重写onCreateOptionsMenu方法,在其中写添加菜单的逻辑:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	SubMenu fileMenu = menu.addSubMenu("文件");
	SubMenu editMenu = menu.addSubMenu("编辑");
	fileMenu.add(Menu.NONE,Menu.FIRST+1,1,"新建");
	fileMenu.add(Menu.NONE,Menu.FIRST+2,2,"打开");
	fileMenu.add(Menu.NONE,Menu.FIRST+3,3,"保存");
	editMenu.add(Menu.NONE,Menu.FIRST+4,4,"撤销");
	editMenu.add(Menu.NONE,Menu.FIRST+5,5,"恢复");
	return true;
}
        然后重写菜单项点击方法onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	case Menu.FIRST + 1:
		Toast.makeText(this, "选择的是新建菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 2:
		Toast.makeText(this, "选择的是打开菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 3:
		Toast.makeText(this, "选择的是保存菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 4:
		Toast.makeText(this, "选择的是撤销菜单", Toast.LENGTH_LONG).show();
		break;
	case Menu.FIRST + 5:
		Toast.makeText(this, "选择的是恢复菜单", Toast.LENGTH_LONG).show();
		break;
	}
	return false;
}
        运行截图如下:

Android之Menu_第3张图片

Android之Menu_第4张图片

        这里菜单信息也可以写到XML文件中,方法跟选项菜单里类似,就不复述了。

        最后为了将这些页面组织起来,我用了一个页面显示了6个按钮,点击之后分别跳转到相应的页面,跳转的方法可上篇文章Android之Intent,主界面如下:

Android之Menu_第5张图片

        后记,每每写Demo,总会遇到一些莫名其妙的问题,解决之后总有一种成长的喜悦,希望自己能坚持把Android开发的应用层面都研究完,到时候想到什么功能就可以在自己的手机上装装玩玩。另外在Android 3.0之后Menu就有了导航神奇ActionBar用以替代Menu,有空还是要好好研究下。


项目源码下载


你可能感兴趣的:(android,menu,选项菜单,子菜单,上下文菜单)