概述

菜单(Menu)在Android开发中,是一种常见的用户界面组件,通过使用菜单Api可以给用户提供常见的一致的体验。本文主要讲解三种菜单的相关内容。

菜单的分类

  • 选项菜单(OptionsMenu):选项菜单是活动菜单项的主要集合,主要应用于App上有全局影响的功能,如:搜索,设置等。
  • 上下文菜单(ContextMenu):上下文菜单是一个浮动菜单,当用户在元素上进行长时间单击时会出现。它提供了影响选定内容或上下文框架的操作。
  • 弹出菜单(PopupMenu):弹出菜单主要应用于列表中的列表项,弹出菜单锚定在调用菜单的视图控件上。

涉及知识点

  • registerForContextMenu 注册上下文菜单方法。
  • getMenuInflater() 获取菜单填充对象,通过资源文件实例化菜单对象。
  • popupMenu.getMenu 获取菜单对象

选项菜单(OptionsMenu)

通过重写Activity中的onCreateOptionsMenu 方法,来设置选项菜单;通过重写onOptionsItemSelected方法来处理选项菜单的事件功能。

如下图所示:选项菜单位于App的左上角的三个白色圆点显示,当点击时弹出菜单内容。

关键代码如下:

   /**
* onCreateOptionsMenu重写方法用于创建选项菜单
* 可以通过资源文件进行创建,也可以通过代码进行创建。
* 返回值,如果是true则显示菜单,如果是false则不显示菜单
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu,menu);
return true;
} /**
* 选项菜单,选中事件处理方法
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.m_search :
Toast.makeText(MainActivity.this,"查找",Toast.LENGTH_SHORT).show();
break;
case R.id.m_setting :
Toast.makeText(MainActivity.this,"设置",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}

下文菜单(ContextMenu)

通过重写Activity中的onCreateContextMenu方法来设置上下文菜单,通过重写onContextItemSelected方法来处理上下文菜单的事件。

如下图所示,通过长按控件,就可以弹出上下文菜单。

关键代码如下:

   /**
* 上下文菜单,通过资源文件设置上下文菜单
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context_menu,menu);
} /**
* 上下文菜单响应事件
* @param item
* @return
*/
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.get_width:
Toast.makeText(MainActivity.this,"宽度="+tvContent.getWidth(),Toast.LENGTH_SHORT).show();
break;
case R.id.get_height:
Toast.makeText(MainActivity.this,"高度="+tvContent.getHeight(),Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}

上下文菜单需要通过注册到指定的控件上才可以

 //为控件注册上下文菜单,一般用于GridView和ListView中
registerForContextMenu(tvContent);

弹出菜单(PopupMenu)

通过PopupMenu popupMenu=new PopupMenu(this,v)的方式,声明弹出菜单。其中第二个参数,是菜单锚定的控件,即菜单停靠在哪个控件上。

如下图所示:点击按钮时弹出菜单

关键代码如下,调用show()方法显示菜单:

   /**
*
* @param v 控件本身
*/
public void btnFontClick(View v){
//第二个参数是Anchor表示菜单停靠点
PopupMenu popupMenu=new PopupMenu(this,v);
getMenuInflater().inflate(R.menu.popumenu,popupMenu.getMenu());
popupMenu.show();
//设置监听事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.m_add:
fontSize=fontSize+5;
break;
case R.id.m_sub:
if(fontSize<=10) {
Toast.makeText(MainActivity.this,"字体大小最小为10",Toast.LENGTH_SHORT).show();
}else{
fontSize = fontSize - 5;
}
break;
}
tvContent.setTextSize(fontSize);
return false;
}
});
}

备注

菜单项的功能应用场景有很多,本文旨在抛砖引玉,共同学习。

一起学Android之Menu的更多相关文章

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

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

  2. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  3. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  4. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  5. DoNet屌丝学Android(一)——Android开发准备工作 & No HelloWord & (真机)调试

    先乱扯淡一下吧,本人一.net屌丝,手持Android 4.2.2手机,Win7 x64本本,闲来无聊学习一下Android的开发,至于要开发啥玩意目前没有什么想法,就是想学学,搞不好是三分热度也有可 ...

  6. 从头学Android系列

    从头学Android系列 http://blog.csdn.net/worker90/article/category/888358

  7. 实现Android半透明Menu效果的开发实例

    不知道大家是否用过天天动听,对于它界面上的半透明Menu效果,笔者感觉非常漂亮.下面是天天动听半透明Menu的截图,欣赏下吧: 感觉还不错吧?那么如何实现这种半透明Menu效果呢?本文就重点讨论并给出 ...

  8. 学Android开发 这19个开发工具助你顺风顺水

    学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小 ...

  9. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

随机推荐

  1. echarts3 迁徙图 迁入迁出

    geoCoordMap = { '上海': [121.4648,31.2891], '佛山': [112.8955,23.1097], '保定': [115.0488,39.0948], '兰州': ...

  2. Linux的文本处理工具浅谈-awk sed grep

    Linux的文本处理工具浅谈 awk   老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...

  3. php开启fileinfo扩展

    1.检查当前环境: php -i|grep fileinfo 1 看是否已安装fileinfo扩展,若没有,则进行下一步. 2.安装fileinfo扩展 2.1.下载扩展包 根据各自的版本号进行下载 ...

  4. filddler一个抓包修改的工具 貌似很强大2017.12.07

    filddler直接百度下载  还没弄懂怎么用  有待研究!

  5. html和js,外部js 的下载执行顺序

    当用户开始访问,首先下载html资源和外部js资源,在chrome中显示的是html先下载,然后下载外部js,外部js的下载顺序安引用顺序,但是下载到达情况则视情况而定,接着才是图片和其他资源,但是要 ...

  6. 最近最久未使用页面淘汰算法———LRU算法(java实现)

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次访问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 按照 ...

  7. 13.app后端为什么要用到消息队列

    很多没有实际项目经验的小伙伴,对消息队列系统非常陌生,看着很多架构的介绍中,都提到消息队列.但是,不知道为什么要用消息队列?什么是消息队列?常见的消息队列产品有哪些? 通过阅读本文,帮你解开以上的疑惑 ...

  8. cassandra 在window上的demo

    Cassandra   window使用 1.        下载:http://cassandra.apache.org/download/. 2.        解压后,bin目录下,cassan ...

  9. Java 字符流文件读写

    上篇文章,我们介绍了 Java 的文件字节流框架中的相关内容,而我们本篇文章将着重于文件字符流的相关内容. 首先需要明确一点的是,字节流处理文件的时候是基于字节的,而字符流处理文件则是基于一个个字符为 ...

  10. 【树形dp】Bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏

    Description     约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报 复.她打算破坏刚建成的约翰的网络.    约翰的网络是树形的,连接着N(1≤N≤1000 ...