Android 菜单简析01(OptionsMenu)

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 介绍

时间: 2024-11-14 00:41:30

Android 菜单简析01(OptionsMenu)的相关文章

Android菜单简析02(ContextMenu)

在上一篇文章 Android 菜单简析01(OptionsMenu) 中给大家介绍了OptionsMenu 的使用,这篇接着给大家介绍下ContextMenu 的用法. ContextMenu 简称上下文菜单,通过长按事件响应,有两种响应模式 浮动模式 效果类似弹出的 Dialog,在屏幕的正中央,可以自定义显示的 Menu 以及 MenuItem 的响应 动作模式 通过ActionBar 实现,效果实在 Title 的地方,出现动作条. 特别注意 ContextMenu 的 动作模式 在 An

Android View 简析

基于android 4.4上源码分析: setContentView流程: getwindow() ->setContentView() -> installDecor() -> addView() getWindow()返回的是PhoneWindow installDecor()生成了window的rootView decorView addView() 会导致 decorView -> requestLayout() -> getViewRootImpl() ->

android:installLocation简析

在Froyo(android 2.2,API Level:8)中引入了android:installLocation.通过设置该属性可以使得开发者以及用户决定程序的安装位置. android:installLocation隶属于AndroidManifest.XML中的manifest节点.如下所示: <manifest xmlns:android="http://schemas.android.com/apk/res/android"          package=&quo

Android -- ImageLoader简析

图片的内存缓存实现 Image-Loader库有一个较完整的内存缓存实现,使用者可以根据需要选择已经实现的策略,也可以定制自己项目中需要的策略. 内存缓存实现代码在memory和memory.impl这两个包中,前者就是规范视图,后者是实现视图.memory包中有MemoryCacheAware接口和BaseMemoryCache和LimitedMemoryCache两个抽象类,加上memory.impl包中的WeakMemoryCache类. MemoryCacheAware MemoryCa

Android WebView远程代码执行漏洞简析

0x00 本文参考Android WebView 远程代码执行漏洞简析.代码地址为,https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.下面我们分析代码. 0x01 首先列出项目工程目录: MainActivity.java的代码如下: public class MainActivity extends Activity { private WebView webView; private Uri mUr

Android -- MediaPlayer内部实现简析

Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.现在,这里就通过一个MediaPlayer代码实例,来进一步分析MediaPlayer内部是如何运作.实现的:当然这里的分析只截止到底层调用播放器之前,因为播放器这块实在是没搞懂. 我们使用的例子来源于之前MediaPlayer Playback译文中的官方实例: String url = "http://........"; // your URL here

Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义.解析,并对几个 Android 开源库 Annotation 原理进行简析.PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 完整版原文见:Java Android 注解(Ann

Android RecycleView + CardView 控件简析

今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleView的“列表”样式,Support包默认包含了:LinearLayoutManager  横向或纵向的滚动列表. GridLayoutManager  网格列表.StaggeredGridLayoutManager  交错的网格列表. 2.Adapter负责处理RecycleView的数据和样式 3

功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析(转)

功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析 SimpleCropView是github上第一个第三方开源的图片修剪截取利器,功能强大,设计良好.我个人认为SimpleCropView比附录文章1介绍的cropper更为强大和完备,但也更为复杂,如果是简单的应用场景,那么cropper也是一个不错的选择,SimpleCropView则适应图片裁剪截取复杂的需求任务.SimpleCropView在github上的项目主页是:https://githu