1.菜单的生成
对一个Android应用中的每一个屏幕,也就是说,对每一个Activity类,都会拥
有一个默认菜单。在Activity类中,定义了几个与菜单有关的方法,
供继承于Activity类的子类去重载,从而定制我们自己的菜单。这几个方法为:
public booleanonCreateOptionsMenu(android.view.Menu menu);
public booleanonPrepareOptionsMenu(android.view.Menu menu);
public booleanonOptionsItemSelected(android.view.MenuItem item);
为了生成我们自己的菜单,Android为我们提供了两个时机点。当在Activity类
实例启动时,我们可以通过重载onCreateOptionsMenu()来定制我们的菜单;
另外,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu
来实现。对于第二种方式,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低
对一个菜单的定义步骤:
1、 创建一个包含文本视图的XML布局文件
2、 创建一个Activity类,其中包含在第一步中定义的布局
3、 设置菜单
4、 向菜单添加一些常规菜单项
5、 向菜单添加一些辅助菜单项
6、 响应菜单项
7、 修改AndroidManifest.xml文件。以显示应用程序正确的标题(一定要修改,这个很容易忘)
Android的菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context
Menu)、子菜单(Sub Menu)
一.选项菜单
当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。选
项菜单最多只有六个,超过六个第六个就会自动显示 更多 选项来展示显示。
创建方法:
XML文件
<?xml version="1.0"encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/newFile"
android:icon="@drawable/ic_launcher"
android:title="@string/newFile_title"
/>
<item android:id="@+id/exit"
android:icon="@drawable/ic_launcher"
android:title="@string/exit_title"
/>
</menu>
1、覆盖Activity的onCreateOptionsMenu(Menu menu)方法,当我们第一次打
开菜单时调用。
public boolean onCreateOptionsMenu(Menu menu) {
//获取menu文件
MenuInflater inflater = this.getMenuInflater();
//把获取的menu文件实例填充到menu对象中
inflater.inflate(R.menu.options_menu, menu);
return true;
}(基本不可或缺的)
2、调用Menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的
setIcon()方法为菜单项设置图标。
menu.add(1,SAVE, 1, "保存");
menu.add(1, SAVE_AS, 2, "另存为");
menu.add(1, DELETE, 3, "删除");
menu.findItem(SAVE).setIcon(R.drawable.ic_launcher);
第一个参数表示给这个新增的菜单项分配一个分组号;
第二个参数表示给这个新增的菜单项分配一个唯一标识id;
第三个参数表示给这个新增的菜单项分配一个顺序
第四个参数为菜单项的标题。
我们可以通过调用Menu.setItemShown()或者Menu.setGroupShown()方法来显示或隐藏一些菜单项。
3、当菜单项(MenuItem)被选中时,覆盖Acitivy的onOptionsMenuSelected()
方法响应事件。
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.newFile:
Toast.makeText(this, "newfile", Toast.LENGTH_SHORT).show();
break;
case R.id.exit:
this.finish();
break;
case DELETE:
menu.removeGroup(2);
menu.removeItem(SAVE_AS);
break;
}
return true;
}
响应事件 点击exit会直接退出;
点击删除按钮直接把SAVE_AS删除 就是另存为
menu.removeItem(SAVE_AS);
二、上下文菜单
当用户长按Activity页面时,弹出的菜单我们称为上下文菜单。我们经常
在Windows中用鼠标右键单击弹出的菜单就是上下文菜单。
1、覆盖Activity的onCreateContextMenu()方法,调用Menu的add方法添加
菜单项MenuItem
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.sub_menu, menu);
super.onCreateContextMenu(menu,v, menuInfo);
}(跟上边相同 add添加也相同)
2、覆盖onContextItemSelected()方法,响应菜单单击事件
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.sub1:
break;
case R.id.sub2:
break;
}
return super.onContextItemSelected(item);
}
3、调用registerForContextMenu()方法,为视图注册上下文菜单
TextView tv=(TextView) this.findViewById(R.id.idd);
this.registerForContextMenu(tv);(一定要注册)
弹出菜单也可以响应事件
按住所注册的TexrView几秒钟会出现
三、子菜单
子菜单就是将相同功能的分组进行多级显示的一种菜单,比如,Windows
的“文件”菜单中就有“新建”,“打开”,“关闭”等子菜单。
创建子菜单的方法
1、覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()
方法添加子菜单项
子菜单可以通过XML定义
<item android:id="@+id/menuitem1"
android:title="menuitem1"/>
<item android:id="@+id/menuitem2"
android:title="menuitem2">
<menu>
<item
android:id="@+id/sub1"
android:title="sub1"
></item>
<item
android:id="@+id/sub2"
android:title="sub2"
></item>
</menu>
</item>
也可以通过调用SubMenu的add(),添加子菜单项
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.sub_menu, menu);
SubMenu subMenu=menu.addSubMenu(1, SUBMENU, 1, "子菜单");
subMenu.add(20, SUBITEM1, 1, "subitem1");
subMenu.add(20, SUBITEM2, 2, "subitem2");
subMenu.add(30, SUBITEM3, 3, "subitem3");
// subMenu.setGroupCheckable(20, true, true);
// subMenu.getItem(0).setCheckable(true);
subMenu.getItem(0).setChecked(true);//选中这个 如果为false;则不选中
subMenu.findItem(SUBITEM3).setCheckable(true);
return true;
}
2、覆盖onCreateItemSelected()方法,响应菜单单击事件
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menuitem1:
Toast.makeText(this, "newfile", Toast.LENGTH_SHORT).show();
break;
case R.id.menuitem2:
this.finish();
break;
case SUBITEM1:
break;
case SUBITEM2:
this.finish();
break;
}
return true;
}
点击子菜单
menu.add的方法中的参数:
1.int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,
以便更好的以组的方式管理你的菜单按钮。可以用到的方法有:
removeGroup(id)
setGroupCheckable(id, checkable, exclusive)
setGroupEnabled(id,boolean enabled)
setGroupVisible(id,visible)
2.int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item
ID对应一个Menu中的选项。在后面使用菜单的时候,就是靠这个item ID来判
断,你选中的是哪个选项。
3、int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜
单的显示顺序就是按照add的顺序来显示。
4.String类型的title参数,表示选项中显示的文字。