【Android基础知识】选项菜单、上下文菜单、子菜单的使用
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: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基础知识】选项菜单、上下文菜单、子菜单的使用相关推荐
- android基础知识
技术型男 随笔 - 20, 文章 - 0, 评论 - 4, 引用 - 0 android基础知识 1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速 ...
- Android基础知识~入门进阶,一步步走到高手
Android基础知识~入门进阶,一步步走到高手 2011年09月01日 [b]希望新入手ANDROID设备的朋友认真阅读本帖,一些简单的问题就可以自己解决了!!! 一:基础知识[/b] [b]1.什 ...
- 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
目录 一.Android基础知识介绍 1.1 Android 历史版本 1.2 apk 包文件结构 1.3 Android系统目录介绍 二.jadx的使用 2.1 jadx 的简介 2.2 jadx ...
- Android基础知识——完善
首页 下载App × Android基础知识--完善 布鲁马 2016.05.17 10:29* 字数 5478 阅读 2672评论 1喜欢 38 疯狂Android摘要,Android基础知识好乱好 ...
- dedecms二级菜单中判断子菜单标签的方法
这篇文章将为大家详细讲解有关dedecms二级菜单中判断子菜单标签的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获. 虚拟接口是用户本地数据中心通过海外专线访问V ...
- Android基础知识:在UI线程中运行代码
本文翻译自:Android basics: running code in the UI thread In the viewpoint of running code in the UI threa ...
- Android基础知识【项目实训-实现二级导航“今日活动”及读取数据库】【5】
[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 ...
- Android 基础知识+app测试权限问题
Android 基础知识(权限篇)** 前言 Android是一个开源的,基于Linux的移动设备操作系统,主要用于移动设备,如智能手机和平板电脑.Android是由谷歌及其他公司带领的开放手机联 ...
- Android基础知识巩固系列 Android之四大组件——ContentProvider(内容提供者)
因为最近要面试,于是打算整理整理一下Android的基础知识,由于之前本人已经学习过大概的Android基础知识,这里主要讲这四大组件.五大存储.六大布局.网络请求等这些内容,其他一些等有时间再整理, ...
最新文章
- 2013高教社杯---B碎纸片的拼接复原
- canal解析mysql日志异常_利用Canal解析mysql binlog日志
- java基础 Unsafe
- python快速处理ppt_人生苦短,我用 Python 之快速遍历 PPT
- 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)
- python汉诺塔递归算法_Python文摘:汉诺塔问题与递归算法
- 文件系统错误的解决方案
- 你根本不会休息(转)
- paypal ec.php,paypal 支付流程
- 罗升阳 51test 博客
- 用html把图片整体往左挪动,网页制作如何让图片从左到右循环移动
- 淘码手机验证码平台——唯一可以批量接收验证码及批量解封账号的平台
- JavaScript保姆级教程
- 通过 WebRTC 共享屏幕很容易
- 组合逻辑电路一——数字逻辑实验
- 从1-100求质数 Python for else
- 2018年中国安全生产事故总量、较大事故、重特大事故同比实现“三个下降”
- OpenCL编程(1)- 开发环境搭建(NVIDIA GPU+Win10篇)
- Tomcat 错误锦集
- Gox语言中的结构类型-GX10.1