今天继续Android学习之旅之Menu的记录。主要分为三个部分:1.选项菜单OptionMenu;2.上下文菜单ContextMenu;3.子菜单SubMenu;
首先需要注册上下文菜单,在初始化时调用registerForContextMenu方法注册。然后跟选项菜单类似,重载onCreateContextMenu以添加上下文菜单,代码如下:
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;
}
运行截图如下:
当然菜单信息还可以写到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;
}
运行截图如下:
这里菜单信息也可以写到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;
}
运行截图如下:
这里菜单信息也可以写到XML文件中,方法跟选项菜单里类似,就不复述了。
最后为了将这些页面组织起来,我用了一个页面显示了6个按钮,点击之后分别跳转到相应的页面,跳转的方法可上篇文章Android之Intent,主界面如下:
后记,每每写Demo,总会遇到一些莫名其妙的问题,解决之后总有一种成长的喜悦,希望自己能坚持把Android开发的应用层面都研究完,到时候想到什么功能就可以在自己的手机上装装玩玩。另外在Android 3.0之后Menu就有了导航神奇ActionBar用以替代Menu,有空还是要好好研究下。