Menu
Android支持的Menu有以下几种:
1.常规菜单
2.子菜单
3.上下文菜单
4.图标菜单
5.辅助菜单
6.交替菜单
菜单不仅作为Java对象,还表示为资源,我们可以通过XML制作自己的菜单,然后通过资源id来使用.
每个Activity都能拥有一个菜单(android.view.Menu),而这个菜单中能自由的扩展子菜单(android.view.SubMenu)或包含菜单项(android.view.MenuItem).
回调函数:onCreateOptionsMenu()和onOptionsItemSelected()分别用于菜单的创建和菜单项的选择.
菜单的创建
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);//调用父类方法创建系统菜单
menu.add(0, 1, 0, "add");
menu.add(0, 2, 1, "item");
menu.add(0, 3, 2, "del");
return true;//返回true菜单才能显示
}
菜单项的响应
1.通过onOptionsItemSelected()来响应
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
return true;//返回true跳出处理
case 2:
return true;
}
return super.onOptionsItemSelected(item);//使用父类的处理方法,返回false
}
2.通过监听器来响应
设置MenuItem的监听器
new OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item) {
//do something
return true;
}
};
onMenuItemClick()在点击菜单时调用,如果onMenuItemClick()返回true,则会停止其他回调的执行,包括onOptionsItemSelected().就是说,监听器的优先级比onOptionsItemSelected()的优先级高.
3.通过Intent来响应
使用MenuItem的setIntent(intent)方法,将菜单项与Intent关联,当Intent与菜单项关联后,如果没有其他方法来处理菜单项时,默认将会使用Intent的startActivity(intent)来调用该intent.
图标菜单
Android中除了使用文本菜单,还可以使用图标菜单.
但使用图标菜单会有一些限制:
1.图标菜单没法用于扩展菜单.
2.图标菜单不支持菜单项单选标记
3.与文本菜单一样,如果图标菜单中的文字过长,将会进行截断.
创建图标菜单的方法很简单,只要使用MenuItem的setIcon()方法即可.
子菜单
通过Menu的addSumMenu()方法可以轻松的往菜单添加子菜单,返回SubMenu对象,但没法往子菜单中在添加子菜单.
另外,如果一个图标菜单作为子菜单,则其图标会被忽略.
上下文菜单
在Android中,通过长按指令来调出上下文菜单.
上下文菜单与常规菜单不同之处在于:常规菜单式基于Activity的,一个Activity拥有一个菜单,而上下文菜单式基于视图的,因此一个Activity可以拥有多个上下文菜单.
通过Activity的onCreateContextMenu()方法来激活上下文菜单.它的作用类似于onCreateOptionsMenu().该回调函数返回上下文菜单对应的视图对象.
另外上下文菜单不同于常规菜单的地方在于:常规菜单是Activity自动创建的.而上下文菜单是需要手动注册的,想哪个视图拥有上下文菜单就对哪个视图进行注册.通过Activity的registerForContextMenu(view)来实现.
TextView tv = (TextView) findViewById(R.id.myText);
registerForContextMenu(tv);//为视图tv注册上下文菜单
为视图注册后,android会调用onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("My Context Menu");
menu.add(1, 1, 1, "项目1");
}
使用onContextItemSelected()方法来响应上下文项的单击事件.
@Override
public boolean onContextItemSelected(MenuItem item) {
if(item.getItemId()==1){
Toast.makeText(this, "item id : 1", 1000).show();
return true;
}
return super.onContextItemSelected(item);
}
这里只有item可以使用,不明白为什么没有提供view,如果两个上下文菜单项目的itemid相同,则上面的判断就有误了.
交替菜单
交替菜单的意思就是允许一个应用程序使用另外一个应用程序的菜单.
动态的菜单
假如希望菜单的内容是动态的,则应该使用onPrepareOptionsMenu()代替onCreateOptionsMenu(),onPrepareOptionMenu()在每次使用菜单时都会调用,这时就能根据实际情况修改菜单内容.
使用XML加载菜单
菜单xml一般放在/res/menu目录下,使用文件名作为资源id,下面是一个menu示例,文件名位mymenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group
android:id="@+id/group1">
<item
android:id="@+id/item1"
android:orderInCategory="1"
android:title="item1"/>
<item
android:id="@+id/item2"
android:orderInCategory="1"
android:title="item2"/>
</group>
</menu>
接着是如何使用这个menu资源,Android提供了一个类:MenuInflater来载入xml菜单资源.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);//调用父类方法创建系统菜单
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mymenu, menu);
return true;//返回true菜单才能显示
}