Android中的Menu(菜单)控件有三种类型:
1. 选项菜单 (Options menu)
2. 上下文菜单 (Context menu)
3. 弹出菜单 (Popup menu)
使用XML文件来定义菜单布局,菜单xml文件要建在/res/menu目录中,跟创建Menu有关的xml标签有:
<menu>: 用来定义一个菜单,必须是菜单xml文件的根标签。
<item>: 用来定义菜单中的选项。内部也可以包含另一个<menu>标签来创建子菜单。
<group>: 用来将一组<item>整合并分类。
示例: 文件名为 my_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/file"
android:title="@string/file" >
<!-- "file" submenu -->
<menu>
<item
android:id="@+id/create_new"
android:title="@string/create_new" />
<item
android:id="@+id/open"
android:title="@string/open" />
</menu>
</item>
<item android:id="@+id/new_game"
android:icon="@drawable/ic_new_game"
android:title="@string/new_game"
android:showAsAction="ifRoom|withText"/> <!-- showAsAction可以让该选项显示在ActionBar上而不是...中,如果既有icon又有title,那么默认显示icon,如何想要显示title就应该加上withText -->
<item android:id="@+id/help"
android:icon="@drawable/ic_help"
android:title="@string/help" />
</menu>
一. Options Menu
options menu的显示与Android版本有关.
Android 2.3.X (API Level <= 10) :
多余6个的item会在more中被集成
Android 3.0 (API Level > 10):
如果<item>中设置了android:showAsAction="ifRoom"就会像 2号选项 那么显示
要想把刚才的my_menu.xml加入到程序中,只需要在源码文件中的 onCraeteOptionsMenu(Menu menu) 中加入如下代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu); //在这里通过填充器把菜单的xml的文件传入第一个参数
return true;
}
如果想要在用户选择了某个选项时执行某些功能,可以在相应的Activity文件中加入如下代码:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.new_game:
newGame();
return true;
case R.id.help:
showHelp();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
如果要给菜单动态添加选项可以使用 onPrepareOptionsMenu()方法,onPrepareOptionsMenu() 会在用户每次点击菜单时都会执行一次,而onCreateOptionsMenu()只在程序开始时执行一次(Android 2.3.X或以下的版本是在用户第一次点击点菜的时候执行)。动态添加选项的代码如下:
public boolean onPrepareOptionsMenu(Menu menu) {
menu.add("item name");
return true;
}
二. Context Menu
Context menu类似于我们做长按操作时弹出的那种菜单,如图:
想要制作这种context menu需要三个步骤:
(1) 首先要注册context menu,通过 registerForContextMenu(View v)来注册,参数是要弹出context menu的View控件,比如现在我们的layout xml文件中定义了一个id为 a_view 的控件,我们希望长按 a_view 的时候弹出我们将要定义的菜单,那么可以这么写代码:
registerForContextMenu((View) findViewById(R.id.a_view));
(2) 类似于onCreateOptionsMenu(),如果要创建context menu需要使用 onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info) 函数来创建,实例如下:
@Override
public void onCreateContextMenu(ContextMenu menu, View view, /*参数View就是关联此菜单的控件,也就是你长按这个view就会弹出该菜单*/
ContextMenuInfo menuInfo) {
<span style="white-space:pre"> </span>super.onCreateContextMenu(menu, view, menuInfo);
<span style="white-space:pre"> </span>menu.add("item1");
<span style="white-space:pre"> </span>menu.add("item2");
}
(3) 如果想要在用户点击选项的时候执行某些功能,可以添加如下代码(类似于Options menu的处理方式,函数名字不同罢了):
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
editNote(info.id);
return true;
case R.id.delete:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
三. Popup Menu(API Level >= 11 才可以)
看了context menu的图片后可能一听"popup"就觉得两种菜单是不是相似的,其实 Popup Menu 的显示是有区别的,popup menu的显示方式类似与我们平时单击鼠标右键弹出的那种菜单,就是你点在哪里,就从哪里蹦出菜单,而不是像context menu 那样菜单都在屏幕中间弹出。
样式类似于下图:
(点击了箭头后弹出了下面的菜单)
如果要制作一个Popup Menu,可以按如下步骤:
(1)首先需要有一个控件来作为弹出pop menu的源,那我们就以一个<TextView>来写实例吧,先在layout xml文件中定义如下代码:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="pop"
android:onClick="showPop" /> <!-- 没错,就跟定义普通的onClick事件一样 -->
(2)然后只需在 showPop() 函数中实现Popup Menu 的生成和弹出即可:
public void showPop(View view) {
PopupMenu pop = new PopupMenu(this, view);
pop.getMenuInflater().inflate(R.menu.mymenu, pop.getMenu());
pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { //可以这样处理用户点击事件
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.*:
break;
default:
return false;
}
}
});
pop.show();
}