Android-Menu菜单使用一
创建菜单
在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与组是独立的。
操作菜单组的方法:
- removeGroup(id) -- 参数为组id,删除改组的所有菜单项
- setGroupCheckable(id,checkable,exclusive) -- 在选中菜单项时在该菜单相中显示一个勾选标记。当应用到组中时,它将为该组中的所有菜单项启用此功能。如果设置了此方法的独占标志exclusive,那么只允许该组中的一个菜单项处于勾选状态。其他菜单项将保持位选中状态。
- setGroupEnabled(id,boolean enabled) -- 启用或禁用给定组中的菜单项
- setGroupVisible(id,visible) -- 控制改组菜单项是否可见
响应菜单项
- 通过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。
- 通过监听器响应菜单项
- 实现OnMenuClickListener接口。然后获取此实现的一个实例并将其传递给菜单项。当单击菜单项时,该菜单项将调用OnMenuClickListener接口的onMenuItemClick()方法。
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);
}- onMenuItemClick方法在调用菜单项时调用。这段代码会在单击菜单项时执行,即使这一操作发生在调用onOptionsItemSelected()方法之前也是如此。如果onMenuItemClick返回true,将不会执行其他任何回调,包括onOptionsItemSelected()回调方法。这意味着,监听器代码的优先级高于onOptionsItemSelected()方法。
- 使用Intent响应菜单项
- 使用MenuItem的setIntent(intent)方法,将菜单项与Intent关联。默认情况下,菜单项没有与之关联的Intent。但是当Intent与菜单项关联,并且没有其他方法处理菜单项时,默认的行为将石使用startActivity(intent)调用该Intent。为此,所有处理程序(尤其是onOptionItemSelected方法)应该为未被处理的菜单项调用父类的onOptionItemSelected()方法。或者可以这样理解:系统为onOptionItemSelected方法提供了首先处理菜单项的机会。这里假设没有与菜单项直接联系的监听器,如果有,监听器将覆盖剩余的菜单项。
- 如果没有重写onOptionsItemSelected()方法,那么Android框架中的基类将执行必要的操作,在菜单项上调用Inten。如果重写了此方法但对此菜单项不感兴趣,那么必须调用父方法,父方法然后会调用Intent。所以基本思路是这样的:要么补充写onOptionsItemSelected()方法,要么重写他并为未处理的菜单项调用父方法。
- 通过onOptionsItemSelected响应菜单项
Android-Menu菜单使用一的更多相关文章
- android menu菜单自动生成
Android提供了一些简单的方法来为应用添加Menu菜单. 提供了三种类型应用菜单: 一.Options Menu:通过Menu按钮调用菜单 1.在/res/目录下新建menu文件夹,用于存储Men ...
- Android Menu菜单使用
如上图右上角,菜单选项的编辑,第一种代码实现方式如下: package com.example.menu; import android.os.Bundle; import android.app.A ...
- Android menu菜单的深入了解。。。
今天补充刚开始的菜单控件,这是基于: https://www.cnblogs.com/aolong/p/12868015.html 里面的菜单写的. 今天学的后面部分是结合昨天的Fragment一起的 ...
- 从零開始学android<Menu菜单组件.三十.>
在Android系统之中.菜单一共同拥有三类:选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu). 今天我们就用几个样例来分别介绍下菜单的使用 acti ...
- Android动态修改ToolBar的Menu菜单
Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...
- 【Android】详解Android的menu菜单
在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ...
- Android添加Menu菜单
在安卓中添加Menu菜单十分简单. 步骤: 1.在menu文件夹中的main.xml文件中添加要添加的项目. <menu xmlns:android="http://schemas.a ...
- android开发学习——关于activity 和 fragment在toolbar上设置menu菜单
在做一个项目,用的是Android Studio 系统的抽屉源码,但是随着页面的跳转,toolbar的title需要改变,toolbar上的menu菜单也需要改变,在网上找了好久,也尝试了很多,推荐给 ...
- android简洁饼状图组件、圆形Menu菜单、画板画笔应用、答题应用等源码
Android精选源码 android自动监听复制内容源码 Android上简洁轻量级的饼图控件 好看的 Android 圆形 Menu 菜单效果 android画笔.画板功能效果的实现 Androi ...
- Android开发中的menu菜单
复写onCreateOptionsMenu方法,当点击menu菜单时,调用该方法. @Override public boolean onCreateOptionsMenu(Menu menu) { ...
随机推荐
- .net core 分布式配置中心
github地址 https://github.com/wangchengqun/ratel 配置文件 数据同步端口 Server: ip: 127.0.0.1 port: 7890 浏览器访问 ht ...
- 解决SHAREJPOINT 跨域问题
目前仅支持IE7/8不支持IE11和谷歌 对于跨域情况,目前找到如果jquery是get获取方式,可以配置web.config相关属性,具体powershell命令如下: Add-PSSnapin M ...
- sam(后缀自动机)
后缀自动机ins解释 void ins(int c){ int p=last;//将当前节点的parent节点变为last int np=++cnt;//建立新节点 last=np;//将last设为 ...
- MySQL随手记
一.MySQL数据迁移(由远端主机迁移到本地) 1.导出数据库mysqldump -u root -p db > dump_db_date.sqlroot: 账户db: 需要导出的数据库名 2. ...
- FileAttributeView出现空指针异常原因分析
问题? Java7新增了关于文件属性信息的一些新特性,通过java.nio.file.*包下面的类可以实现设置或者读取文件的元数据信息(比如最后修改时间,创建时间,文件大小,是否为目录等等).尤其 ...
- win7 配置Windows Update 失败,还原更改,无法进入系统
win7 配置Windows Update 失败,还原更改,无法进入系统 win7 系统安装好后,忘记了需要关闭自动更新,某天自动更新补丁安装失败,进入下图状态,无法进入正常系统. 解决方案一:使用+ ...
- psutil 跨平台根据程序名杀进程
笔者在项目中遇到过需要根据进程名杀进程的需求,利用python库psutil实现了此功能. 模块地址: https://pypi.python.org/pypi/psutil/ psutil功能 ...
- Vue, React, AngularJS, and Angular2. 我们对流行JavaScript框架们的选择
2017-08-04 前端大全 (点击上方公众号,可快速关注) 英文:ANTONI ZOLCIAK 译文:众成翻译 www.zcfy.cc/article/vue-react-angularjs-a ...
- Celery启动Django项目:Client sent AUTH, but no password is set 错误处理
celery -A CeleryTest worker -l info [2017-02-22 07:26:52,666: ERROR/MainProcess] consumer: Cannot co ...
- numpy中int类型与python中的int
[code] import numpy as np nparr = np.array([[1 ,2, 3, 4]]) np_int32 = nparr[0][0] # np_int=1 py_int ...