• 创建菜单

   在AndroidSDK中,无需从头创建菜单对象。因为一个活动只与一个菜单关联,所以Android会为该活动创建此菜单,然后将它传给Activity类的onCreateOptionsMenu回调。此方法可用于使用一组菜单项填充单个传入的菜单。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//....
return super.onCreateOptionsMenu(menu);
}

  当填充菜单项之后,这段代码返回true,使菜单可见。如果返回false,菜单将不可见。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, //菜单组
1, //菜单项id
0, //菜单项排序id
"option1"); //菜单项标题
menu.add(0, 2, 1, "option2");
menu.add(0, 3, 2, "option3");
return super.onCreateOptionsMenu(menu);
}

  添加菜单项所必需的第一个参数是菜单组id(int型)。第二个参数是菜单项id,在选择该菜单项时会将它发送给回调函数。第三个参数表示排序id。最后一个参数是菜单项的标题(即显示的菜单项名称)。

  除了title参数以外的三个参数:菜单组,菜单项id,菜单项排序id都是可选的,如果不想指定任何id,可以使用Menu.NONE。

  • 使用菜单组

@Override
public boolean onCreateOptionsMenu(Menu menu) {
int group1 = 1;
menu.add(group1, 1, 1, "g1.item1");
menu.add(group1, 2, 2, "g1.item2");
int group2 = 2;
menu.add(group2, 3, 3, "g2.item1");
menu.add(group2, 4, 4, "g2.item2");
return super.onCreateOptionsMenu(menu);
}

这里需要注意,菜单项id和排序id与组是独立的。

操作菜单组的方法:

  1. removeGroup(id)   -- 参数为组id,删除改组的所有菜单项
  2. setGroupCheckable(id,checkable,exclusive)  -- 在选中菜单项时在该菜单相中显示一个勾选标记。当应用到组中时,它将为该组中的所有菜单项启用此功能。如果设置了此方法的独占标志exclusive,那么只允许该组中的一个菜单项处于勾选状态。其他菜单项将保持位选中状态。
  3. setGroupEnabled(id,boolean enabled)  -- 启用或禁用给定组中的菜单项
  4. setGroupVisible(id,visible)  -- 控制改组菜单项是否可见
  • 响应菜单项

    1. 通过onOptionsItemSelected响应菜单项

      • @Override
        public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch (item.getItemId()) {
        case 1:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        case 2:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        case 3:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        case 4:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        }
        return super.onOptionsItemSelected(item);
        }

        这里的关键模式是通过MenuItem类的getItemId()方法检查菜单项id,然后执行必要的操作。如果onOptionsItemSelected()处理了一个菜单项,它将返回true。此菜单事件将不会进一步传播。对于onOptionsItemSelected()未处理的菜单项回调,onOptionsItemSelected()应该通过super.onOptionsItemSelected()调用父方法。onOptionsItemSelected()的默认实现返回false。

    2. 通过监听器响应菜单项
      1. 实现OnMenuClickListener接口。然后获取此实现的一个实例并将其传递给菜单项。当单击菜单项时,该菜单项将调用OnMenuClickListener接口的onMenuItemClick()方法。
      2. class MyResponse implements OnMenuItemClickListener{
        
                @Override
        public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
        case 1:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        case 2:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        case 3:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        case 4:
        Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();
        break;
        }
        return true;
        }
        }
            @Override
        public boolean onCreateOptionsMenu(Menu menu) { int group1 = 1;
        menu.add(group1, 1, 1, "g1.item1");
        menu.add(group1, 2, 2, "g1.item2");
        int group2 = 2;
        menu.add(group2, 3, 3, "g2.item1");
        menu.add(group2, 4, 4, "g2.item2"); for (int i = 1; i < menu.size(); i++) {
        menu.getItem(i).setOnMenuItemClickListener(new MyResponse());
        }
        return super.onCreateOptionsMenu(menu);
        }
      3.   onMenuItemClick方法在调用菜单项时调用。这段代码会在单击菜单项时执行,即使这一操作发生在调用onOptionsItemSelected()方法之前也是如此。如果onMenuItemClick返回true,将不会执行其他任何回调,包括onOptionsItemSelected()回调方法。这意味着,监听器代码的优先级高于onOptionsItemSelected()方法。
    3. 使用Intent响应菜单项
      1. 使用MenuItem的setIntent(intent)方法,将菜单项与Intent关联。默认情况下,菜单项没有与之关联的Intent。但是当Intent与菜单项关联,并且没有其他方法处理菜单项时,默认的行为将石使用startActivity(intent)调用该Intent。为此,所有处理程序(尤其是onOptionItemSelected方法)应该为未被处理的菜单项调用父类的onOptionItemSelected()方法。或者可以这样理解:系统为onOptionItemSelected方法提供了首先处理菜单项的机会。这里假设没有与菜单项直接联系的监听器,如果有,监听器将覆盖剩余的菜单项。
      2. 如果没有重写onOptionsItemSelected()方法,那么Android框架中的基类将执行必要的操作,在菜单项上调用Inten。如果重写了此方法但对此菜单项不感兴趣,那么必须调用父方法,父方法然后会调用Intent。所以基本思路是这样的:要么补充写onOptionsItemSelected()方法,要么重写他并为未处理的菜单项调用父方法。

       

      

  

Android-Menu菜单使用一的更多相关文章

  1. android menu菜单自动生成

    Android提供了一些简单的方法来为应用添加Menu菜单. 提供了三种类型应用菜单: 一.Options Menu:通过Menu按钮调用菜单 1.在/res/目录下新建menu文件夹,用于存储Men ...

  2. Android Menu菜单使用

    如上图右上角,菜单选项的编辑,第一种代码实现方式如下: package com.example.menu; import android.os.Bundle; import android.app.A ...

  3. Android menu菜单的深入了解。。。

    今天补充刚开始的菜单控件,这是基于: https://www.cnblogs.com/aolong/p/12868015.html 里面的菜单写的. 今天学的后面部分是结合昨天的Fragment一起的 ...

  4. 从零開始学android&lt;Menu菜单组件.三十.&gt;

    在Android系统之中.菜单一共同拥有三类:选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu). 今天我们就用几个样例来分别介绍下菜单的使用 acti ...

  5. Android动态修改ToolBar的Menu菜单

    Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...

  6. 【Android】详解Android的menu菜单

    在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ...

  7. Android添加Menu菜单

    在安卓中添加Menu菜单十分简单. 步骤: 1.在menu文件夹中的main.xml文件中添加要添加的项目. <menu xmlns:android="http://schemas.a ...

  8. android开发学习——关于activity 和 fragment在toolbar上设置menu菜单

    在做一个项目,用的是Android Studio 系统的抽屉源码,但是随着页面的跳转,toolbar的title需要改变,toolbar上的menu菜单也需要改变,在网上找了好久,也尝试了很多,推荐给 ...

  9. android简洁饼状图组件、圆形Menu菜单、画板画笔应用、答题应用等源码

    Android精选源码 android自动监听复制内容源码 Android上简洁轻量级的饼图控件 好看的 Android 圆形 Menu 菜单效果 android画笔.画板功能效果的实现 Androi ...

  10. Android开发中的menu菜单

    复写onCreateOptionsMenu方法,当点击menu菜单时,调用该方法. @Override public boolean onCreateOptionsMenu(Menu menu) { ...

随机推荐

  1. C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明

    这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...

  2. winform自动升级方案

    未涉及过winform升级,研究一阵,大致出来个不成熟的方案. 我的解决方案(判断升级,升级程序下载安装包的压缩包,解压,自动安装,重新启动程序). 1.首先根据服务器中软件版本号和本地软件版本号是否 ...

  3. JQuery Mobile - 导航栏选中状态代码

    class="ui-btn-active" 参考: https://wizardforcel.gitbooks.io/w3school-jqmobile/content/8.htm ...

  4. Redis---SDS(简单动态字符串)

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类 ...

  5. Data - Hadoop伪分布式配置 - 使用Hadoop2.8.0和Ubuntu16.04

    系统版本 anliven@Ubuntu1604:~$ uname -a Linux Ubuntu1604 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb ...

  6. HTTP的请求报文与响应报文

    报文: 简单来说,报文就是也就是HTTP报文,作用是在各个系统之间进行和响应时用来交换与传输的数据单元,即站点一次性要发送的数据块,这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义 ...

  7. 为什么需要jQuery Mobile

        1.没有所谓的移动互联网,只有一个互联网     2.设计移动网站不需要什么特别处理     3.一个站点应当在所有设备(台式机.手机.电视)上都能运转     jQuery Mobile诞生 ...

  8. flask信号使用

    flask信号: 安装: flask中的信号使用的是一个第三方插件,叫做blinker.通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blin ...

  9. (转)MVC 与三层架构

    原文:https://juejin.im/post/5929259b44d90400642194f3 MVC 与三层架构 一.简述 在软件开发中,MVC与三层架构这两个专业词汇经常耳闻,同时总有很多人 ...

  10. Zookeeper--0300--java操作Zookeeper,临时节点实现分布式锁原理

    删除Zookeeper的java客户端有  : 1,Zookeeper官方提供的原生API, 2,zkClient,在原生api上进行扩展的开源java客户端 3, 一.Zookeeper原生API ...