【转】android小结(一)之menu
原文网址:http://zhouyunan2010.iteye.com/blog/1151215
android提供有三种menu类型
一.Options Menu(选项菜单)
这是一组item选项的集合,当用户点击MENU button时,此menu就会出现。如果是3.0以后的版本可以通过action bar直接选择menu item
二.Context Menu(上下文菜单)
当用户长按住一个注册了上下文菜单的控件时,会弹出一个上下文菜单,它是一个流式的列表,供用户选择某项
三.Submenu(子菜单)
一个item项可以包含一个内嵌的子菜单
1.下面讲如何创建一个Options Menu菜单
通过xml布局文件创建菜单项
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_game"
- android:icon="@drawable/ic_new_game" <!--菜单图标-->
- android:title="@string/new_game" /> <!--菜单文字-->
- <item android:id="@+id/help"
- android:icon="@drawable/ic_help"
- android:title="@string/help" />
- </menu>
调用:重写acitvity的onCreateOptionsMenu方法创建菜单
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.game_menu, menu);
- return true;
- }
你也可以直接调用menu的add方法直接添加菜单项。
options menu响应用户事件需重写activity的onOptionsItemSelected
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle item selection
- switch (item.getItemId()) {
- case R.id.new_game:
- newGame();
- return true;
- case R.id.help:
- showHelp();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
根据item id分别对选中某选项进行处理。return true表示自己已经处理此方法,不需要父类onOptionsItemSelected进行处理。
如果你有多个activity都有相同的menu,可以写一个activity实现onCreateOptionsMenu() and onOptionsItemSelected() 方法,然后其他activity继承此activity
在运行时改变menu item的状态
你需要重写onPrepareOptionsMenu() ,它方便你对item移除,添加,使不可用等
在android 2.3以下,当用户要每次打开menu时就会调用onPrepareOptionsMenu()方法
在android 3.0以上,你必须调用invalidateOptionsMenu() 当你要update你的menu时,因为
action bar是一直出现的。然后系统将调用onPrepareOptionsMenu()更改menu
2.创建一个Context Menu
上下文菜单相当于pc机上的点击鼠标右键弹出框。当用户长按一选项时,上下文菜单就会出现。你能为任何view创建一个上下文菜单,尽管Context Menu多用于listview。
要创建一个Context Menu,你首先必须为你的控件注册registerForContextMenu() ,并重写
onCreateContextMenu() and onContextItemSelected().
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, v, menuInfo);
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.context_menu, menu);
- }
这里使用布局文件创建菜单项,跟options menu差不多。当然你同样可以使用menu.add()方法创建items。ContextMenu.ContextMenuInfo 对象将提供你选择的选项的额外信息,比如id
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
- switch (item.getItemId()) {
- case R.id.edit:
- editNote(info.id);
- return true;
- case R.id.delete:
- deleteNote(info.id);
- return true;
- default:
- return super.onContextItemSelected(item);
- }
- }
3.创建submenu
A submenu is a menu that the user can open by selecting an item in another menu。
一个子菜单能够从另外一个菜单的选项中被打开。你能为任何一个menu添加子菜单,除了submenu。下面看看如何通过布局文件创建一个submenu
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/file"
- android:icon="@drawable/file"
- android:title="@string/file" >
- <!-- "file" submenu -->
- <menu>
- <item android:id="@+id/create_new"
- android:title="@string/create_new" />
- <item android:id="@+id/open"
- android:title="@string/open" />
- </menu>
- </item>
- </menu>
You can also use addSubMenu() to dynamically add a SubMenu to an existing Menu. This returns the new SubMenu object, to which you can add submenu items, using add()
4.其他的menu特性
Menu groups
通过组菜单,你可以同时对一组item进行操作,比如setGroupVisible(),setGroupEnabled(),setGroupCheckable()
下面给出一个包含组菜单的资源文件
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/item1"
- android:icon="@drawable/item1"
- android:title="@string/item1" />
- <!-- menu group -->
- <group android:id="@+id/group1">
- <item android:id="@+id/groupItem1"
- android:title="@string/groupItem1" />
- <item android:id="@+id/groupItem2"
- android:title="@string/groupItem2" />
- </group>
- </menu>
3个item任然是一个兄弟菜单,不同的是你可以通过组操作一组item
Checkable menu items
通过布局文件创建Checkable menu,可以通过使用item的android:checkable属性
和group的android:checkableBehavior属性。例如
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <group android:checkableBehavior="single">
- <item android:id="@+id/red"
- android:title="@string/red" />
- <item android:id="@+id/blue"
- android:title="@string/blue" />
- </group>
- </menu>
APi中:
The android:checkableBehavior attribute accepts either:
single
Only one item from the group can be checked (radio buttons)
all
All items can be checked (checkboxes)
none
No items are checkable
由于不会自动改变checkbox的状态,你必须设置checkbox的状态通过isChecked()和setChecked().
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.vibrate:
- case R.id.dont_vibrate:
- if (item.isChecked()) item.setChecked(false);
- else item.setChecked(true);
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
如果你不手动设置它,当你点击一个选项时,checkbox或者radioButton的状态是不会改变的
Shortcut keys(热键)
你可以为你item设置快速点击热键
在配置文件中通过item的属性android:alphabeticShortcut 和 android:numericShortcut
类文件中通过setAlphabeticShortcut(char) and setNumericShortcut(char).设置的热键不区分大小写
Dynamically adding menu intents
有时候你希望使用menu item来启动一个activity通过intent。你能在onOptionsItemSelected()使用startActivity()
然而如果你不确定用户的移动设备是否拥有一个应用程序来处理这个intent,那么你可以使用Dynamically adding menu intents来决定是否添加此item
一个简单的实例
- @Override
- public boolean onCreateOptionsMenu(Menu menu){
- super.onCreateOptionsMenu(menu);
- // Create an Intent that describes the requirements to fulfill, to be included
- // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
- Intent intent = new Intent(null, dataUri);
- intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
- // Search and populate the menu with acceptable offering applications.
- menu.addIntentOptions(
- R.id.intent_group, // Menu group to which new items will be added
- 0, // Unique item ID (none)
- 0, // Order for the items (none)
- this.getComponentName(), // The current activity name
- null, // Specific items to place first (none)
- intent, // Intent created above that describes our requirements
- 0, // Additional flags to control items (none)
- null); // Array of MenuItems that correlate to specific items (none)
- return true;
- }
addIntentOptions()返回的是你添加的item的个数
Allowing your activity to be added to other menus
如果允许你的activity可以被别的menu添加,必须设置CATEGORY_ALTERNATIVE and/or CATEGORY_SELECTED_ALTERNATIVE values for the intent filter category
- <intent-filter label="Resize Image">
- ...
- <category android:name="android.intent.category.ALTERNATIVE" />
- <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
- ...
- </intent-filter>
- 还有一个notePad的示例我在研究研究
【转】android小结(一)之menu的更多相关文章
- android学习笔记37——Menu资源
Menu菜单资源 android应用推荐使用XML来定义菜单,其可提供更好的解耦方式. 菜单资源通常位于res/menu文件夹下,其菜单根元素为<menu.../>,menu元素下可包含子 ...
- Android开发手记(12) Menu的使用
Android中的Menu分为三种,分别为:OptionsMenu(选项菜单).ContextMenu(上下文菜单).SubMenu(子菜单). 1.OptionsMenu 按Menu键就会显示,用于 ...
- Android中创建option menu
1.首先在res目录下新建一个menu文件夹,右击res目录->New->Directory,输入文件夹名menu,点击OK. 接着在这个文件夹下再新建一个名叫main的菜单文件,右击me ...
- Android studio 中R.menu的创建
对于Android开发中的menu没有声明的情况: 首先,将鼠标定位到红色的menu上面, 然后,Alt+enter组合键,建立文件menu, 然后将以下代码复制进去: <item androi ...
- Android通过XML来定义Menu
直接在代码中添加菜单项,给菜单项分组等,这是比较传统的做法,它存在着一些不足.比如说,为了响应每个菜单项,我们需要用常量来保存每个菜单项的ID等.为此,Android提供了一种更好的方式,就是把men ...
- android中的菜单Menu
Menu是一个接口, 他有2个子接口, SubMenu和ContextMenu; 前者菜单常见于按home键就会出现 ,后者是一个上下文菜单, 一般点击某个条目会在手机屏幕中出现一个类似悬浮窗口的菜单 ...
- Android学习笔记之Menu的ShowAsAction属性的设置
(1)在res--menu目录下的main.xml文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- android学习——Android Studio下创建menu布局文件
一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...
- android小结
一. 对与java读写文件的操作: 字节流: //filename 可以是文件名,可以是文件路径 FileOutputStream outputStream=new FileOutputStream ...
随机推荐
- 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)
说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...
- 4 Java学习之 反射Reflection
1. 反射概念 反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...
- jboss学习 - vfs---转载
jboss的VFS是为了解决什么问题,他为什么有用呢 在jboss中有很多类似的资源操作的代码都分散在程序的各个地方,大多数情况下代码首先确定操作的资源的类型,比如是文件或者是文件夹,通过URL加载的 ...
- MultiWii MWC的软件和调试方法
(如果你的电脑是win7 64位的系统,安装了JAVA虚拟机后GUI仍然运行不了,那你就需要到C:\Program Files\Java\jre7\bin\找到并复制javaw.exe,然后粘贴到C: ...
- MVC4数据访问EF查询linq语句的时候报错找不到表名问题
一天做项目的时候遇到这样的问题,MVC4用EF访问数据查询用linq语句的时候报错找不到表名:报错如下图: 研究了几种情况,最后还是没有找到正真的问题所在,不过可能是和路由解析问题有关,暂时还没有进行 ...
- 设计模式之—简单工厂模式<Simple Factory Pattern >
简单工厂模式结构图: 简单工厂模式以简单的加减乘除运算为例: 运算符类(Operation): namespace CalcTest.Simple_Factory_patterns { class O ...
- java JNI 的实现(1)-又进一步加深对JVM实现的理解
目录 概述 主要优点 主要缺点 JNI实现的简单例子 开发工具 简略步骤 1,在eclipse的 'java类' 中声明一个 'native方法'; 2,使用 'javah' 命令生成包含'nativ ...
- MSSQL 简单练习回顾
这段时间,报了浦软培训的.NET,现在整理回顾下,算是个小小总结吧 为了便于操作,我没有在多个数据库间切换数据库实例,以一个总的数据库实例 test_demo为源进行的相关操作,代码的注释根据我的理解 ...
- 华为S5300交换机配置基于VLAN的本地端口镜像
配置思路 1. 将Ethernet0/0/20接口配置为观察端口(监控端口) 2. 将VLAN 1.11.12.13.14配置为镜像VLAN 配置步骤 1. 配置观察端口 <Switch& ...
- oracle 中如何定位重要(消耗资源多)的SQL【转】
1.查看值得怀疑的SQL )||'%'load, s.executions executes, p.sql_text from(select address, disk_reads, executio ...