Android菜单类型

菜单是为了增加更多的功能,不占用屏幕的空间。Android中菜单类型有三类,选项菜单(OptionMenu)、上下文菜单(ContextMenu)、子菜单(SubMenu),下面分别详细介绍这些菜单。

选项菜单(OptionMenu)

① 创建选项菜单:重写Activity的onCreateOptionMenu(Menu menu)方法。

-设置菜单项可用代码动态设置menu.add();

-还可以通过xml设置MenuInflater.inflate();

②设置菜单点击事件:onOptionsItemSelected();

③菜单关闭后发生的动作:onOptionMenuClosed(Menu menu);

④选项菜单显示之前会调用,可以在这里根据需要调整菜单:onPrepareOptionsMenu(Menu menu);

⑤打开后发生的动作。 onMenuOpened(int featureId,Menu menu);

方法一:通过xml设置菜单(res/menu/menu.xml)

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:context="com.example.menudemo.MenuActivity" ><group android:id="@+id/group1"><itemandroid:id="@+id/action_menu1"android:orderInCategory="300"android:menuCategory="container"android:showAsAction="never"android:title="menu1"/><itemandroid:id="@+id/action_menu2"android:orderInCategory="200"android:menuCategory="system"android:showAsAction="never"android:title="menu2"/></group><group android:id="@+id/group2"><itemandroid:id="@+id/action_menu3"android:orderInCategory="100"android:menuCategory="secondary"android:showAsAction="never"android:title="menu3"/><itemandroid:id="@+id/action_menu4"android:orderInCategory="400"android:menuCategory="alternative"android:showAsAction="never"android:title="menu4"/></group>
</menu>

<item>标签的属性含义解释:

属性名

作用

menuCategory

设置菜单项的种类。有四个可选值:container、system、secondary、alternative。通过menuCategory属性可以控制菜单项的位置。

orderInCategory

同类菜单的排列顺序,为整数值,值越大显示越靠前。

titleCondensed

菜单项的短标题。当菜单文字太长时显示这个

alphabeticShortcut

菜单项的字母快捷键。

showAsAction

Never:总是显示在移除菜单中。

Always:显示在ActionBar上。

ifRoom:如果actionBar空间足够就显示在ActionBar上。

withText:默认格式如果是含有文字和图表的话,只显示图标,使用ifRoom|withText可以显示图标和文字。

collapseActionView:

<item android:id="@+id/menu_search"
       android:title="@string/menu_search"
       android:icon="@drawable/ic_menu_search"

android:showAsAction="ifRoom|collapseActionView"

android:actionViewClass="android.widget.SearchView" />

android:showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。

参考链接:http://blog.csdn.net/think_soft/article/details/7370686

<group>标签的作用是可以进行整组操作,把一些具有相同操作的菜单放到一个组内。

在Activity里加载菜单

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu, menu);return true;}

方法二:通过代码添加menu

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//调用这个方法设置图标的可见性setIconVisible(menu);/** add()方法的四个参数,依次是:* 1、组别,如果不分组的话就写Menu.NONE,* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单* 3、顺序,那个菜单现在在前面由这个参数的大小决定,参数越小,显示的越前* 4、文本,菜单的显示文本*/menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(android.R.drawable.ic_menu_delete);// setIcon()方法设置菜单图标menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_save);menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(android.R.drawable.ic_menu_help);menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(android.R.drawable.ic_menu_add);menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(android.R.drawable.ic_menu_info_details);menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(android.R.drawable.ic_menu_send);return true;
}
//使用反射设置menu图标的可见性private void setIconVisible(Menu menu) {try {Class clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");Method m = clazz.getDeclaredMethod("setOptionalIconsVisible",boolean.class);m.setAccessible(true);m.invoke(menu, true);} catch (Exception e) {e.printStackTrace();}}

菜单显示效果如下图:

选项菜单设置点击监听

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {Log.i(TAG, "onOptionsItemSelected");int id = item.getItemId();switch (id) {case Menu.FIRST+1:Toast.makeText(MenuActivity.this, "点击了删除按钮", Toast.LENGTH_SHORT).show();break;default:break;}return super.onOptionsItemSelected(item);}

上下文菜单

当用户长时间按键不放时,弹出来的菜单称为上下文菜单。Windows中用鼠标右键弹出的菜单就是上下文菜单。

创建上下文菜单的步骤:

① 调用registerForContextMenu()方法,为视图注册上下文菜单。如textView tv

registerForcontextMenu(tv);

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_menu);tv = (TextView)findViewById(R.id.tv);registerForContextMenu(tv);}

② 覆盖Activity的onCreateContextMenu()方法,调用Menu的add方法添加菜单项(MenuItem)

@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {setIconVisible(menu);// TODO Auto-generated method stubmenu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(android.R.drawable.ic_menu_delete);// setIcon()方法设置菜单图标menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_save);menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(android.R.drawable.ic_menu_help);menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(android.R.drawable.ic_menu_add);menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(android.R.drawable.ic_menu_info_details);menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(android.R.drawable.ic_menu_send);super.onCreateContextMenu(menu, v, menuInfo);}

③ 覆盖onContextItemSelected()方法,响应菜单单击事件。

@Overridepublic boolean onContextItemSelected(MenuItem item) {// TODO Auto-generated method stubint id = item.getItemId();switch (id) {case Menu.FIRST+1:Toast.makeText(MenuActivity.this, "点击了删除按钮", Toast.LENGTH_SHORT).show();break;default:break;}return super.onContextItemSelected(item);}

显示效果

子菜单

子菜单:把相同功能的分组进行多组显示的菜单。

创建子菜单步骤:

① 覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法添加子菜单项(subMenu)

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//调用这个方法设置图标的可见性setIconVisible(menu);/** add()方法的四个参数,依次是:* 1、组别,如果不分组的话就写Menu.NONE,* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单* 3、顺序,那个菜单现在在前面由这个参数的大小决定,参数越小,显示的越前* 4、文本,菜单的显示文本*///添加子菜单  SubMenu subMenu = menu.addSubMenu(0,2,Menu.NONE, "难度星级->").setIcon(android.R.drawable.ic_menu_directions);  //添加子菜单项  subMenu.add(2, 100, 1, "☆☆☆☆☆");  subMenu.add(2, 101, 2, "☆☆☆");  subMenu.add(2, 102, 3, "☆");
}

② 覆盖onOptionsItemSelected()方法响应点击事件。上下文菜单处理方式和此一致。

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {Log.i(TAG, "onOptionsItemSelected");int id = item.getItemId();switch (id) {case 100:Toast.makeText(MenuActivity.this, "点击了五颗星", Toast.LENGTH_SHORT).show();break;default:break;}return super.onOptionsItemSelected(item);}

PopuoMenu

PopupMenu可以非常方便的在指定view的下面显示一个弹出菜单,类似于actionbar溢出菜单的效果。它的菜单选项可以来自于menu资源。

使用方法

①创建PopupMenu对象,绑定view

②加载布局文件

③设置MenuItemClickListener,处理点击监听

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_menu);tv = (TextView)findViewById(R.id.tv);tv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(MenuActivity.this, tv);//加载菜单文件popupMenu.getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Overridepublic boolean onMenuItemClick(MenuItem item) {// TODO Auto-generated method stubint id = item.getItemId();switch (id) {case R.id.today:Toast.makeText(MenuActivity.this, "点击了今天", Toast.LENGTH_SHORT).show();break;default:break;}return false;}});//显示popupMenupopupMenu.show();}});}

菜单文件popup_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/today"  android:title="今天"/>  <item  android:id="@+id/tomorrow"  android:title="明天"/>
</menu>

【Android基础知识】选项菜单、上下文菜单、子菜单的使用相关推荐

  1. android基础知识

    技术型男 随笔 - 20, 文章 - 0, 评论 - 4, 引用 - 0 android基础知识 1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速 ...

  2. Android基础知识~入门进阶,一步步走到高手

    Android基础知识~入门进阶,一步步走到高手 2011年09月01日 [b]希望新入手ANDROID设备的朋友认真阅读本帖,一些简单的问题就可以自己解决了!!! 一:基础知识[/b] [b]1.什 ...

  3. 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用

    目录 一.Android基础知识介绍 1.1 Android 历史版本 1.2 apk 包文件结构 1.3 Android系统目录介绍 二.jadx的使用 2.1 jadx 的简介 2.2 jadx ...

  4. Android基础知识——完善

    首页 下载App × Android基础知识--完善 布鲁马 2016.05.17 10:29* 字数 5478 阅读 2672评论 1喜欢 38 疯狂Android摘要,Android基础知识好乱好 ...

  5. dedecms二级菜单中判断子菜单标签的方法

    这篇文章将为大家详细讲解有关dedecms二级菜单中判断子菜单标签的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获. 虚拟接口是用户本地数据中心通过海外专线访问V ...

  6. Android基础知识:在UI线程中运行代码

    本文翻译自:Android basics: running code in the UI thread In the viewpoint of running code in the UI threa ...

  7. Android基础知识【项目实训-实现二级导航“今日活动”及读取数据库】【5】

    [该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 ...

  8. Android 基础知识+app测试权限问题

    Android 基础知识(权限篇)** 前言 ​ Android是一个开源的,基于Linux的移动设备操作系统,主要用于移动设备,如智能手机和平板电脑.Android是由谷歌及其他公司带领的开放手机联 ...

  9. Android基础知识巩固系列 Android之四大组件——ContentProvider(内容提供者)

    因为最近要面试,于是打算整理整理一下Android的基础知识,由于之前本人已经学习过大概的Android基础知识,这里主要讲这四大组件.五大存储.六大布局.网络请求等这些内容,其他一些等有时间再整理, ...

最新文章

  1. 2013高教社杯---B碎纸片的拼接复原
  2. canal解析mysql日志异常_利用Canal解析mysql binlog日志
  3. java基础 Unsafe
  4. python快速处理ppt_人生苦短,我用 Python 之快速遍历 PPT
  5. 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)
  6. python汉诺塔递归算法_Python文摘:汉诺塔问题与递归算法
  7. 文件系统错误的解决方案
  8. 你根本不会休息(转)
  9. paypal ec.php,paypal 支付流程
  10. 罗升阳 51test 博客
  11. 用html把图片整体往左挪动,网页制作如何让图片从左到右循环移动
  12. 淘码手机验证码平台——唯一可以批量接收验证码及批量解封账号的平台
  13. JavaScript保姆级教程
  14. 通过 WebRTC 共享屏幕很容易
  15. 组合逻辑电路一——数字逻辑实验
  16. 从1-100求质数 Python for else
  17. 2018年中国安全生产事故总量、较大事故、重特大事故同比实现“三个下降”
  18. OpenCL编程(1)- 开发环境搭建(NVIDIA GPU+Win10篇)
  19. Tomcat 错误锦集
  20. Gox语言中的结构类型-GX10.1

热门文章

  1. jboot_jboot这些框架有意义吗
  2. 全国青少年编程等级考试python一级真题2020年6月(含题库答题软件账号)
  3. shields 徽标_纽约公共图书馆的新徽标
  4. vue-ssr在项目中的实践
  5. 分析在智能语音对话流程
  6. c# Process监控进程 与 ManagementEventWatcher 监控进程
  7. 域权限维持—黄金票据和白金票据
  8. 2.4G无线音频双向传输技术运用
  9. css图形动画,CSS3 实现图形下落动画效果
  10. 三维建模初学者学习方法及资料