1.普通的Menu
在Activity中覆盖onCreateOptionsMenu(Menu menu)方法,该方法负责生产menu,它是一个回调函数,即当按下手机设备上的menu按钮时Android系统才会生产菜单。
public boolean onCreateOptionsMenu(Menu menu) {
//menu.add(arg0, arg1, arg2, arg3)给按钮添加一项菜单
//第一个参数:分组的id,如果不用分组则设为0
//第二个参数:menu中每一项的id,这个id应该是唯一的
//第三个参数:排序的信息,根据这个字段的大小,menu对其中的项进行排序显示:小的排在前面
//第四个参数:menu项的显示信息
menu.add(0, MENU_ITEM_1, 0, "APPLE");
menu.add(0, MENU_ITEM_2, 0, "ORANGE");
return super.onCreateOptionsMenu(menu);
}
如果要添加单击事件,则要覆盖onOptionsItemSelected(MenuItem item)方法。
public boolean onOptionsItemSelected(MenuItem item) {
//通过id判断传来的item,这个id通过item.getItemId()得到
switch(item.getItemId()){
case MENU_ITEM_1:
t = Toast.makeText(this, "you choose the apple", Toast.LENGTH_SHORT);
t.show();
break;
case MENU_ITEM_2:
t = Toast.makeText(this, "you choose the orange", Toast.LENGTH_SHORT);
t.show();
break;
}
return true;
}
2.子菜单(SubMenu)
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_ITEM_1, 1, "APPLE");
menu.add(0, MENU_ITEM_2, 2, "ORANGE");//为menu创建SubMenu对象
SubMenu subMenu = menu.addSubMenu(0, MENU_ITEM_3, 3, "BANANA");//向subMenu中添加选项
subMenu.add(0, 31, 31, "BIG BANANA");
subMenu.add(0, 32, 32, "SMALL BANANA");
return super.onCreateOptionsMenu(menu);
}
3.上下文菜单(ContextMenu)——长按特定View后弹出的菜单
任何视图都可以注册ContextMenu,但最常见的是用于列表视图ListView的item。
在onCreate方法中为View注册ContextMenu。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contextmenu);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
//为Button注册ContextMenu
registerForContextMenu(btn1);
registerForContextMenu(btn2);
}
覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法添加菜单项(MenuItem)
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
if(v==btn1){//设置菜单标题
menu.setHeaderTitle("this is the frist");//添加菜单
menu.add(0, 200, 0, "context menu 1");
menu.add(0, 201, 0, "context menu 2");
}
if(v==btn2){//设置菜单标题
menu.setHeaderTitle("this is the second");//添加菜单
menu.add(0, 300, 0, "context menu 3");
menu.add(0, 301, 0, "context menu 4");
}
super.onCreateContextMenu(menu, v, menuInfo);
}
4.动态Menu
onPrepareOptionsMenu()在菜单列表即将显示出来时决定哪些菜单要显示哪些不显示,当然也可以做一些其他工作。
public boolean onPrepareOptionsMenu(Menu menu) {
String currentText = textview.getText().toString();
if("M".equals(currentText)){
//先清掉菜单
menu.clear();
//可以通过点击这个菜单项来改变textview的值,这样(变成N)就可以测试了
MenuItem item = menu.add(0, 400, 401, "to N");
//android自带的图标
item.setIcon(android.R.drawable.alert_dark_frame);
}
if("N".equals(currentText)){
//先清掉菜单
menu.clear();
//可以通过点击这个菜单项来改变textview的值,这样(变成M)就可以测试了
MenuItem item = menu.add(0, 401, 402, "to M");
item.setIcon(android.R.drawable.alert_light_frame);
}
//现在共有两个菜单子项
menu.add(0, 402, 403, "Now is " + currentText);
return super.onPrepareOptionsMenu(menu);
}
5.用XML文件方式创建Menu
在res/目录下建一个文件夹,名为menu,下面建一个xml文件,名为menu_xml_file.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/grout_main">
<item android:id="@+id/menu_1"
android:title="This 1"/>
<item android:id="@+id/menu_2"
android:title="This 2" />
</group>
</menu>
在Activity中覆盖onCreateOptionsMenu(Menu menu)方法
public boolean onCreateOptionsMenu(Menu menu) {
//MenuInflater类用来实例化菜单XML文件成菜单对象//获取当前菜单
MenuInflater inflater = getMenuInflater();
//inflate(int menuRes, Menu menu)填充菜单//从一个指定的xml资源去填充菜单,如果有错误会抛掷InflateException
//menuRes 要加载XML布局文件中的资源ID
//menu 要填充的菜单,这些项目和子菜单就被添加到要填充菜单中
inflater.inflate(R.menu.menu_xml_file, menu);
return true;
}
其他都和在Activity中创建Menu相同。
小知识:单击MENU按钮时,在Activity中回调的函数可能有两个:
第一个是onOptionsItemSelected(),这个函数只在第一次单击当前应用中的MENU按钮时回调,以后再不回调。
第二个是onPrepareOptionsMenu(),这个函数在每次单击MENU按钮后显示MENU时被系统回调,每次MENU显示前都会回调此函数。我们一般根据条件改变MENU显示的逻辑都放在这个函数里面。
转自:http://zhouyuting714.blog.163.com/blog/static/1811643182011327101931489/