Android 的菜单机制,在 Android 3.0 之前和之后有很大的去别,Android 3.0 推出 ActionBar ,导航的 UI 交互有很大的变化,但菜单的逻辑和接口还是一样的。这里主要介绍下 Android 菜单创建、使用,后面介绍 ActionBar,SherlockActionBar 与 菜单的结合使用,自定义菜单的创建。
Android 菜单主要有4种:
OptionMenu
ContextMenu
PopMenu
SubMenu
下面先介绍下 OptionMenu ,分别使用 xml 文件和 JAVA 代码创建 菜单。
1.OptionMenu
选项菜单,点击 Menu 键时弹出,选中菜单项或者点击其他区域,菜单消失。
optionMenu 的相关方法的实现在 Activity 中 ,相关的方法有:
@Override public boolean onCreateOptionsMenu(Menu menu) { Log.d(tag, "onCreateOptionsMenu"); return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { Log.d(tag, "onPrepareOptionsMenu"); return super.onPrepareOptionsMenu(menu); } @Override public void onOptionsMenuClosed(Menu menu) { System.out.println("onOptionsMenuClosed"); Log.d(tag, "onOptionsMenuClosed"); super.onOptionsMenuClosed(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_save: Log.d(tag, "action_save"); break; case R.id.action_settings: Log.d(tag, "action_settings"); break; case R.id.action_delete: Log.d(tag, "action_delete"); break; case R.id.action_edit: Log.d(tag, "action_edit"); break; } return super.onOptionsItemSelected(item); }
onCreateOptionMenu ,在 Activity 生命周期内 只执行一次,onPrepareOptionMenu每次打开菜单都会执行,菜单消失的时候执行onOptionsMenuClosed方法,菜单被选中时执行 onOptionsItemSelected 。
下面看下在 Android 2.3 系统上用 XML 创建的 OptionMenu ,具体效果图如下。
第一张:4个菜单选项,没有图标
第二张:8个菜单项,有图标
第三张:点击更多,没有图标
同样的代码,如果 不兼容(最低版本>11) Android 3.0 之前的版本,在 Android4.4 上是什么效果呢 ?
第一张:4个菜单选项,没有图标 ,只显示出两个,多了一个更多的标识
第二张:点击更多菜单项
第三张:8个菜单项,有图标,但是显示出的菜单没有文字,更多中菜单项只有文字
第四张:点击更多,没有图标
下面看下具体的代码
1. 编写 menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_share" android:orderInCategory="0" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_share" android:title="share"/> <item android:id="@+id/action_save" android:orderInCategory="1" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_save" android:title="save"/> <item android:id="@+id/action_search" android:orderInCategory="2" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_search" android:title="search"/> <item android:id="@+id/action_delete" android:orderInCategory="4" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_delete" android:title="delectAction"/> <item android:id="@+id/action_edit" android:orderInCategory="5" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_edit" android:title="edit"/> <item android:id="@+id/action_help" android:orderInCategory="6" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_help" android:title="help"/> <item android:id="@+id/action_compass" android:orderInCategory="6" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_compass" android:title="compass"/> </menu>
android:orderInCategory 菜单项在 菜单中的位置
2. 在 Activity 中添加 菜单
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); Log.d(tag, "onCreateOptionsMenu"); inflater.inflate(R.menu.main_icon, menu); return super.onCreateOptionsMenu(menu); }
3. 菜单事件的响应
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_save: Log.d(tag, "action_save"); break; case R.id.action_settings: Log.d(tag, "action_settings"); break; case R.id.action_delete: Log.d(tag, "action_delete"); break; case R.id.action_edit: Log.d(tag, "action_edit"); break; case R.id.action_search: Log.d(tag, "action_search"); break; } return super.onOptionsItemSelected(item); }
这样,就完成了菜单的创建、使用、响应。
Android 官方推荐使用 XML 创建菜单,同时也可以在 JAVA 代码中创建 菜单。实现过程如下
a. 直接在 onCreateOptionsMenu() 方法中添加菜单项
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); //menu.add(int groupid,int itemid,int orderid,String title)方法参数 //add 方法返回一个 MenuItem 对象,可以添加图标,调用 setIcon() 方法 Log.d(tag, "onCreateOptionsMenu"); menu.add(0, Menu.FIRST+1, Menu.FIRST+1, menusStrings[0]).setIcon(android.R.drawable.ic_menu_add); menu.add(0, Menu.FIRST+2, Menu.FIRST+2, menusStrings[1]).setIcon(android.R.drawable.ic_menu_agenda); menu.add(0, Menu.FIRST+3, Menu.FIRST+3, menusStrings[2]).setIcon(android.R.drawable.ic_menu_call); menu.add(0, Menu.FIRST+4, Menu.FIRST+4, menusStrings[3]).setIcon(android.R.drawable.ic_menu_close_clear_cancel); menu.add(0, Menu.FIRST+5, Menu.FIRST+5, menusStrings[4]).setIcon(android.R.drawable.ic_menu_crop); menu.add(0, Menu.FIRST+6, Menu.FIRST+6, menusStrings[5]).setIcon(android.R.drawable.ic_menu_upload); inflater.inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); }
b. 响应菜单选中事件
响应选中事件方式和上面一样,就不再贴出代码了~。
关于 OptionsMenu的 介绍就这些啦,大家有问题在评论交流啊
下一篇给大家介绍 ContexMenu 的使用
参考资料:
官方手册
eoe menu wiki
参考博文 menu 介绍
参考博文 menu 介绍