Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 487|回复: 0

[实例教程]Android学习笔记-Menu

[复制链接]

该用户从未签到

发表于 2011-10-22 13:00:47 | 显示全部楼层 |阅读模式
Android学习笔记-Menu
Menu分三种:
Option Menu:选择菜单,单击”menu”按键出现。
ContextMenu:上下文菜单,长按出现。
SubMenu:子菜单
一、创建Menu资源:除了在代码中实例化menu之外,还要在XML中定义所有menu和Item的资源。
Menu资源中包含如下属性:
<menu>
<item>
<group>
二、扩展menu resources:我们可以在代码中通过将xml资源转化为对象来扩展menu资源,如下:
@Override
publicbooleanonCreateOptionsMenu(Menu menu){
MenuInflaterinflater =getMenuInflater();
inflater.inflate(R.menu.game_menu,menu);
return true;
}
getMenuInflater()方法返回了一个MenuInflater对象,用此对象来调用inflate()方法,将menu资源填充到menu对象中。

三、创建Option Menu在Options Menu中的item可通过“MENU”按键或者actionBar(android3.0以上)访问。
当第一次创建option menu时会调用onCreateOptionsMenu()方法,在该方法中我们用xml资源文件来填充Menu,如上面的例子。
3.1响应用户动作当用户点击Item时会调用onOptionsItemSelected(),该方法将用户点击的MenuItem传递。我们可以用getItemId()来识别单击的Item。如下所示:
@Override
publicbooleanonOptionsItemSelected(MenuItemitem) {
   // Handle item selection
switch (item.getItemId()){
caseR.id.new_game:
newGame();
return true;
caseR.id.help:
showHelp();
return true;
default:
        returnsuper.onOptionsItemSelected(item);//将无法处理的操作交给父类来处理是推荐的操作
    }
}
*如果多个activity都拥有相同的menu,我们可以定义一个只实现onCreateOptionsMenu()and onOptionsItemSelected()的activity,然后让其他类来继承该类。如果想在子类中添加新的item,则只需重写onCreateOptionsMenu();并super.onCreateOptionsMenu(menu)使原来的Item也被创建,然后add()新的Item即可。
3.2运行时改变Menu ItemonCreateOptionsMenu()只有在menu刚被创建时才会执行,因此要想随时动态改变OptionMenu就要实现onPrepareOptionsMenu()方法,该方法会传给你Menu对象,供使用
Android2.3或更低的版本会在每次Menu打开的时候调用一次onPrepareOptionsMenu().
Android3.0及以上版本默认menu是打开的,所以必须调用invalidateOptionsMenu()方法,然后系统将调用onPrepareOptionsMenu()执行update操作。

*OptionMenu不能根据current focus来操作Item。ContextMenu可以。

四、创建ContextMenu
ContextMenu当用户长按时出现。ContextMenu必须依赖于某个View,即必须为ContextMenu注册view,调用registerForContextMenu()方法,并传递想要注册的view对象。要想定义ContextMenu的外观和动作必须重写onCreateContextMenu()and onContextItemSelected()两个方法。如下代码所示:
@Override
public void onCreateContextMenu(ContextMenumenu, View v,//用户选择的View
ContextMenuInfomenuInfo) {//可附带额外的信息
super.onCreateContextMenu(menu, v,menuInfo);
MenuInflaterinflater = getMenuInflater();
inflater.inflate(R.menu.context_menu,menu);
}
当用户点击某个Item时将执行onContextItemSelected()方法:
@Override
publicbooleanonContextItemSelected(MenuItemitem) {
AdapterContextMenuInfo info =(AdapterContextMenuInfo) item.getMenuInfo();//获得选择的item位置
switch (item.getItemId()) {
caseR.id.edit:
editNote(info.id);
return true;
caseR.id.delete:
deleteNote(info.id);
return true;
default:
returnsuper.onContextItemSelected(item);
  }
}
注意:ContextMenu中的Item不支持icons和热键(shotcut  keys)
五、创建submenus当创建menu sources时可通过在Item下添加<menu>来实现submenu,代码如下:
<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/file"
android:icon="@drawable/file"
android:title="@string/file" >
<!-- "file" submenu -->
<menu>
<itemandroid:id="@+id/create_new"
android:title="@string/create_new"/>
<itemandroid:id="@+id/open"
android:title="@string/open"/>
</menu>
</item>
</menu>
当用户点击submenu的Item时,父menu的相应的itemselected方法将做相应。如上例optionMenu的onOptionsItemSelected()方法将会响应。
六、Menu的其他特征6.1MenuGroups
Menu groups是一系列具有相同特征的Items的集合,通过Menugroups我们可以做如下工作:
l  显示或者隐藏所有Items:setGroupVisible()
l  使Items同时可用或不可用:setGroupEnabled()
l  使Items同时选民:setGroupCheckable()
我们可以在XML文件中用group来包裹item实现groups,代码如下:
<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item1"
android:icon="@drawable/item1"
android:title="@string/item1"/>
<!-- menu group -->
<groupandroid:id="@+id/group1">
<itemandroid:id="@+id/groupItem1"
android:title="@string/groupItem1"/>
<itemandroid:id="@+id/groupItem2"
android:title="@string/groupItem2"/>
</group>
</menu>
6.2可选择的Menu Items来自图标菜单的Items中不能显示单选或多选按钮。
我们可以为每一个Item用android:checkable来定义选择属性,也可以在group中用android:checkableBehavior来定义整体的选择属性。如下:
<?xml version="1.0"encoding="utf-8"?>
<menuxmlns: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>
android:checkableBehavior属性可以接受如下三个值:
single:likeradio buttons
all:likecheckboxes

none
当某个可选的Item被选中时,系统会调用相应的Itemselected返回方法,此时我们必须手动设置当前item的选中状态,因为它本身并不会自动改变。例如:
@Override
publicbooleanonOptionsItemSelected(MenuItemitem) {
switch (item.getItemId()) {
caseR.id.vibrate:
caseR.id.dont_vibrate:
if (item.isChecked())item.setChecked(false);
elseitem.setChecked(true);
return true;
default:
returnsuper.onOptionsItemSelected(item);
  }
}
如果不做如上设置的话,用户选择后,选择结果将不会被保存。
注意:以上设置也只能保证在当前session中有效,如果想应用destroy销毁后仍然有效就要使用Shared Preferences.
6.3热键(shortcut keys)
如果用户有keyboard的话,便可为items设置热键,可以再<Item>中添加android:alphabeticShortcutand android:numericShortcut,也可以在代码中使用setAlphabeticShortcut(char) and setNumericShortcut(char)设置。热键大小写不敏感,不能添加到Context Menu上。
6.4动态添加menu意图当menu item想通过Intent调用某一activity时,可能此activity并不存在,因此android允许用户动态为menu Item添加意图
添加可以根据activity是否可用来接受intent的Item:
l  定义包含category CATEGORY_ALTERNATIVE and/or CATEGORY_SELECTED_ALTERNATIVE的Intent。
l  调用Menu.addIntentOptions(),android将自动搜索可执行intent的用的应用并添加到menu上
示例代码:
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
super.onCreateOptionsMenu(menu);
   // Create an Intent that describes the requirements to fulfill, to beincluded
   // in our menu. The offering app must include a category value ofIntent.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 beadded
        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 thatdescribes our requirements
        0,      // Additional flags tocontrol items (none)
null); // Array of MenuItems that correlate to specific items (none)

return true;
}
6.5允许自己的application被添加到别人的menu上
必须定义intent-filter且包含CATEGORY_ALTERNATIVEand/or CATEGORY_SELECTED_ALTERNATIVE,代码如下:
<intent-filter label="ResizeImage">
   ...
<categoryandroid:name="android.intent.category.ALTERNATIVE" />
<categoryandroid:name="android.intent.category.SELECTED_ALTERNATIVE" />
   ...
</intent-filter>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-19 04:08 , Processed in 0.357629 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表