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 的使用
参考资料:
原文地址:http://blog.csdn.net/imesong/article/details/39430939