在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧

Android的菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu)
注:其中,Sub Menu就是将功能相同的操作分组显示,他作用在OptionsMenu上,是OptionsMenu的二级菜单

一、选项菜单(Option Menu)

当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。

效果图:

实现过程讲解:

在Activity中重写onCreateOptionsMenu()来创建选项菜单,在中包含了getMenuInflater().inflate(R.menu.main,menu),R.menu.main是res的menu文件夹下的xml文件是放菜单的文件夹;

实现代码:

设置菜单项可以通过两种方法,

1.1,通过在XML文件中添加控件来实现

在R.menu.main的xml文件中,添加item控件来添加设置菜单项;

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.jiapeng.munedemo.MainActivity" > <item
android:id="@+id/mune_enter"
android:orderInCategory="100"
android:title="登录"
app:showAsAction="never"/>
<item
android:id="@+id/mune_setting"
android:orderInCategory="100"
android:title="设置"
app:showAsAction="never"/>
<item
android:id="@+id/mune_out"
android:orderInCategory="100"
android:title="退出"
app:showAsAction="never"/>
</menu>

其中:showAsAction主要是针对这个菜单的显示起作用的,它有三个可选项
always:总是显示在界面上
never:不显示在界面上,只让出现在右边的三个点中
ifRoom:如果有位置才显示,不然就出现在右边的三个点中

java代码和设置监听:

    public boolean onCreateOptionsMenu(Menu menu) {
//导入菜单布局
getMenuInflater().inflate(R.menu.main, menu);
return true;
} public boolean onOptionsItemSelected(MenuItem item) {
//创建菜单项的点击事件
switch (item.getItemId()) {
case R.id.mune_enter:
Toast.makeText(this, "点击了登陆", Toast.LENGTH_SHORT).show();
break;
case R.id.mune_setting:
Toast.makeText(this, "点击了设置", Toast.LENGTH_SHORT).show(); break;
case R.id.mune_out:
Toast.makeText(this, "点击了退出", Toast.LENGTH_SHORT).show();
break; default:
break;
} return super.onOptionsItemSelected(item);
}

1.2、通过动态代码实现

menu.add(groupId,itemId,order,title),

groupId--1:分组的id;
itemId--100:菜单项的id;
order--1:菜单项排序用的;
title--"菜单1":菜单名称;

menu的用法类似于ArrayList,可以调用add方法来加载如
//API大于等于11 时 Item图标不显示
menu.add(1,100,1,"菜单一");
menu.add(1,101,1,"菜单二");
menu.add(1,102,1,"菜单三");
add方法返回的是item,可以赋值给item,再调用item的setTitle与setIcon(在API>=11时,是不显示图标的)来设置item。

代码如下:

public boolean onCreateOptionsMenu(Menu menu) {
// groupId--1:分组的id;itemId--100:菜单项的id;order--1:菜单项排序用的;title--"菜单1":菜单名称;
MenuItem item = menu.add(1, 100, 1, "菜单项");
item.setTitle("我是一个菜单");
// 在API>=11时,是不显示图标的
item.setIcon(R.drawable.ic_launcher);
menu.add(1, 101, 1, "登录");
menu.add(1, 102, 1, "设置");
menu.add(1, 103, 1, "退出"); return true;
} public boolean onOptionsItemSelected(MenuItem item) {
// 创建菜单项的点击事件
switch (item.getItemId()) {
case 101:
Toast.makeText(this, "你点击了登录", Toast.LENGTH_SHORT).show();
break;
case 102:
Toast.makeText(this, "你点击了设置", Toast.LENGTH_SHORT).show();
break;
case 103:
Toast.makeText(this, "你点击了退出", Toast.LENGTH_SHORT).show();
break; default:
break;
} return super.onOptionsItemSelected(item);
}

二、上下文菜单(Context Menu)

当用户长按Activity页面时,弹出的菜单我们称为上下文菜单。我们经常在Windows中用鼠标右键单击弹出的菜单就是上下文菜单。

ContextMenu与OptionMenu的区别:
1、OptionMenu对应的是activity,一个activity只能拥有一个选项菜单;
2、ContextMenu对应的是view,每个view都可以设置上下文菜单;
3、一般情况下ContextMenu常用语ListView或者GridView

实现步骤:

(1)首先给View注册上下文菜单registerForContextMenu()
this.registerForContextMenu(contextView);
(2)添加上下文菜单的内容onCreateContextMenu()

效果图:

代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jiapeng.munedemo.MainActivity"
tools:ignore="MergeRootFrame" > <ListView
android:id="@+id/mune_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</ListView> </FrameLayout>
  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showListView();
// 注册上下文菜单
this.registerForContextMenu(listview);
} /**
* 加载数据
*/
private void showListView() {
listview = (ListView) findViewById(R.id.mune_list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, getDate());
listview.setAdapter(adapter); } /**
* 创建数据源
*
* @return list
*/
private ArrayList<String> getDate() {
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
list.add("菜单" + i);
}
return list;
} /**
* 添加上下文菜单的菜单项
*/
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("上下文菜单");
menu.setHeaderIcon(R.drawable.ic_launcher);
//加载上下文菜单内容
menu.add(1, 1, 1, "保存");
menu.add(1, 2, 1, "更改");
menu.add(1, 3, 1, "删除");
super.onCreateContextMenu(menu, v, menuInfo);
} /**
* 创建单击事件
*/
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "点击了保存", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "点击了更改", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "点击了删除", Toast.LENGTH_SHORT).show();
break; default:
break;
}
return super.onContextItemSelected(item);
}

注:何为上下文菜单:Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。因为上下文菜单根据鼠标位置来判断弹出什么的菜单(如桌面右击显示个性化菜单,文件右击则显示针对文件操作删除等的菜单)也就是根据上下文来判断如何弹出和弹出哪种菜单,所以称为上下文菜单。手机上就是长按会弹出选项

三、子菜单(Sub Menu)

就是将功能相同的操作分组显示,他作用在OptionsMenu上,是OptionsMenu的二级菜单

实现步骤:

(1)重写onCreateOptionsMenu()方法
(2)点击事件,重写onOptionsItemSelected()方法

注意:

(1)SubMenu.add(groupId, itemId, order, title);
因为每个SubMenu有一个groupId,所以需要使用这个groupId区别是点击了那个子菜单
(2)APP的样式会影响子菜单的显示风格

效果图:

代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jiapeng.munedemo.MainActivity"
tools:ignore="MergeRootFrame" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SubMenu"
android:textSize="30sp" /> </FrameLayout>
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu fileMenu = menu.addSubMenu("查看文件");
SubMenu editMenu = menu.addSubMenu("输入文件");
//添加菜单项
fileMenu.add(1, 1, 1, "文件1");
fileMenu.add(1, 2, 1, "文件2");
fileMenu.add(1, 3, 1, "文件3");
editMenu.add(2, 1, 1, "输入1");
editMenu.add(2, 2, 1, "输入2");
editMenu.add(2, 3, 1, "输入3");
return super.onCreateOptionsMenu(menu);
} //创建点击事件
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getGroupId() == 1) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "点击了文件1", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "点击了文件2", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "点击了文件3", Toast.LENGTH_SHORT).show();
break; default:
break;
}
} else if (item.getGroupId() == 2) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "点击了输入1", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "点击了输入2", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "点击了输入3", Toast.LENGTH_SHORT).show();
break; default:
break;
}
}
return super.onOptionsItemSelected(item);
}

原文连接:Android基础之简单Mune菜单详解

【Android】详解Android的menu菜单的更多相关文章

  1. 详解Android首选项框架ListPreference

    详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...

  2. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  3. MTP in Android详解

    MTP in Android详解 最近好长一段时间没有做笔记了,今天主要学习一下MTP相关的知识. MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套 ...

  4. 详解android:scaleType属性

    详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262    http://juliaailse. ...

  5. adb shell 命令详解,android

    http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...

  6. 详解Android Activity---启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

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

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

  8. Android Binder IPC详解-Android学习之旅(96)

    linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...

  9. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  10. adb shell 命令详解,android, adb logcat

    http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...

随机推荐

  1. 在使用Vs2013打开Vs2008的解决方案时出现了以下错误:此版本的应用程序不支持其项目类型(.csproj)

    在使用Vs2013打开Vs2008的解决方案时出现了以下错误: 无法打开 因为此版本的应用程序不支持其项目类型(.csproj). 在网络上找到解决方案: 命令行或者Vs自带的命令提示符输入:deve ...

  2. [Angular CLI] Build application without remove dist folder for Docker Volume

    When we develop the Angular app inside Docker container, we can simulate Production envioment by bui ...

  3. hdu 5411 CRB and Puzzle (矩阵高速幂优化dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5411 题意:按题目转化的意思是,给定N和M,再给出一些边(u,v)表示u和v是连通的,问走0,1,2... ...

  4. 自定义Spring注解bean的命名策略

    由于项目的需要spring的业务相关的bean不是写在xml文件中,因为项目是一个模块一个模块提交的,提交的时候不想修改xml文件,因此就用到了spring的注解Service. 例如: Java代码 ...

  5. C#.NET常见问题(FAQ)-如何改变字符串编码

    使用Encoding.Convert方法即可实现转换   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: ...

  6. SpringBoot添加对Mybatis分页插件PageHelper的支持

    1.修改maven配置文件pom.xml,添加对pageHelper的支持: <!--pagehelper--> <dependency> <groupId>com ...

  7. Jenkins Xcode 证书设置错误 Code Sign error: No matching codesigning identity found: No codesigning identities

    Jenkins 集成Xcode 项目的时候在证书上遇到了问题.实际上如果在本地的话.只要Xcode工程里选择了项目就不需要重新设置证书了.jenkins会自动找到这个证书,只要在build setti ...

  8. typescript - 前言介绍

    众所周知,JavaScript是弱语言(子承父业都表达不了),因此比较大的企业考虑到可维护性以及安全性来说,都不用它开发,因此Typescript诞生了,它并不是为了替换JavaScript而诞生的, ...

  9. angularjs中templateUrl的路径问题

    angularjs中templateUrl的路径问题 templateUrl的相对路径是现对于app主页面的,因为template使用js来加载的.

  10. CentOS 6.9 下安装DB2

    操作系统:CentOS6.9_x64 DB2安装文件: db2_v101_linuxx64_expc.tar.gz 安装数据库 tar zxvf db2_v101_linuxx64_expc.tar. ...