选项菜单就是点击硬键盘的菜单键时弹出的菜单,需要重写Activity的onCreateOptionsMenu()方法。
先上类图。
1.继承关系:
2.关联关系:
温馨提示:SubMenu不能再添加SubMenu,也就是说SubMenu不能嵌套。
下面是一个例子。
Activity类:
package com.zzj.ui.menudemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.zzj.ui.R; public class MenuActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.menudemo_activity); } @Override public boolean onCreateOptionsMenu(Menu menu) { Intent intent = new Intent(MenuActivity.this, OtherActivity.class); intent.putExtra("title", "删除"); /* * * add()方法的四个参数,依次是: * * 1、组别,如果不分组的话就写Menu.NONE, * * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * * 3、顺序,那个菜单现在在前面由这个参数的大小决定 * * 4、文本,菜单的显示文本 */ menu.add(Menu.NONE, Menu.FIRST + 1, 7, "删除") .setIcon(android.R.drawable.ic_menu_delete).setIntent(intent); menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon( android.R.drawable.ic_menu_save); menu.add(Menu.NONE, Menu.FIRST + 3, 3, "查找").setIcon( android.R.drawable.ic_menu_search); menu.add(Menu.NONE, Menu.FIRST + 4, 4, "发送").setIcon( android.R.drawable.ic_menu_send); menu.add(Menu.NONE, Menu.FIRST + 5, 5, "详细").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE, Menu.FIRST + 6, 6, "帮助").setIcon( android.R.drawable.ic_menu_help); menu.addSubMenu(Menu.NONE, Menu.FIRST + 7, 1, "添加") .setIcon(android.R.drawable.ic_menu_add) .setHeaderIcon(android.R.drawable.ic_menu_add) .add(Menu.NONE, Menu.FIRST + 71, 1, "添加联系人") .setIcon(android.R.drawable.ic_menu_add); // 如果返回false,菜单将不会显示 return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(MenuActivity.this, "删除", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 2: Toast.makeText(MenuActivity.this, "保存", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 3: Toast.makeText(MenuActivity.this, "查找", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 4: Toast.makeText(MenuActivity.this, "发送", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 5: Toast.makeText(MenuActivity.this, "详细", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 6: Toast.makeText(MenuActivity.this, "帮助", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 7: Toast.makeText(MenuActivity.this, "添加", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 71: Toast.makeText(MenuActivity.this, "添加联系人", Toast.LENGTH_LONG) .show(); break; default: break; } // 如果返回true,不会再触发MenuItem后面的事件。例如,点击【删除】菜单项时,不会跳转到另一个Activity。实际上就是控制事件传播 return false; } @Override public void onOptionsMenuClosed(Menu menu) { Toast.makeText(MenuActivity.this, "选项菜单关闭了", Toast.LENGTH_LONG).show(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { Toast.makeText(MenuActivity.this, "选项菜单将打开", Toast.LENGTH_LONG).show(); // 如果返回false,菜单将不会显示 return true; } }其他的代码就免了。
点击菜单键盘:
点击【添加】:
点击【More】:
我们还可以在XML文件中定义菜单,避免代码臃肿。
res/menu/optionsmenu.xml:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <group android:id="@+id/file" > <item android:id="@+id/news" android:title="新建"/> <item android:id="@+id/save" android:icon="@android:drawable/ic_menu_save" android:title="保存"/> <item android:id="@+id/other_save" android:title="另保存"/> <item android:id="@+id/close" android:title="关闭"/> </group> <group android:id="@+id/edit" > <item android:id="@+id/copy" android:title="复制"> <!-- 子菜单 --> <menu> <item android:id="@+id/copytolocal" android:title="复制到当前文件夹"/> <item android:id="@+id/copytoother" android:title="复制到其他文件夹"/> </menu> </item> <item android:id="@+id/paste" android:title="粘帖"> </item> <item android:id="@+id/cancel" android:title="撤销"> </item> </group> </menu>然后重写onCreateOptionsMenu()方法:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.optionsmenu, menu); return true; }