AndroidGUI11:OptionsMenu的常用技巧
来源:互联网 发布:mac安装brew命令 编辑:程序博客网 时间:2024/06/06 01:46
Menu有几种形式:
1. Context Menu:ContextMenu的菜单项(Menu Item)不支持快捷键,也不支持图标。
2. Option Menu包含两种Menu:IconMenu和ExpandedMenu。Icon Menu的菜单项(MenuItem)是唯一支持Icon的MenuItem,也是唯一不支持CheckBox和Radio按钮的MenuItem。ExpandedMenu是一个竖直列表,当用户点击Icon Menu中的“more”菜单项时弹出。“More”菜单项,仅在IconMenu菜单项超过6个时才会出现。
3. Sub Menu本身支持icon,但SubMenu的菜单项(Menu Item)不支持icon,SubMenu也不支持嵌套的Sub Menu。
本文仅讨论上面的2、3两种情况。ContextMenu将在另外一篇文章中讨论。
1. 首先将本项目要用到的一些图标资源,放入到res/drawable-mdpi文件夹下。
它们的文件名分别为:
cn.png、uk.png、us.png、au.png、ch.png
它们的文件名分别为:
basketball.png、tableball.png、usfootball.png、volleyball.png、boxing.png、compass.png、football.png、golf.png、iceskate.png
图片资源放到res/drawable-mdpi文件夹后,系统会自动为它们生成对应的ID号,比如为cn.png生成的ID为R.drawable.cn
2. 创建两个Activity,点击某些菜单项时会将界面分别跳转到这两个Activity。
第一个Activity代码:
public class Countries extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.countries);
}
}
第一个Activity对应的布局文件countries.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageButton
android:id= "@+id/image_button1"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:src = "@drawable/cn"
/>
<ImageButton
android:id= "@+id/image_button2"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:src = "@drawable/uk"
/>
<ImageButton
android:id= "@+id/image_button3"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:src = "@drawable/us"
/>
<ImageButton
android:id= "@+id/image_button4"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:src = "@drawable/au"
/>
<ImageButton
android:id= "@+id/image_button5"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:src = "@drawable/ch"
/>
</LinearLayout>
第二个Activity代码:
public class Anything extends Activity
{
@Override
protected voidonCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.anything);
}
}
第二个Activity所对应的布局文件anything.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFF00"
android:textSize="30sp"
android:text="Hello, Android!"
/>
</LinearLayout>
3. 在AndroidManifest.xml中,增加上述两个Activity的描述,否则当界面要跳转到它们时,系统会给出找不到Activity的警告。在AndroidManifest.xml中,在Application标签内,增加如下代码:
<activity android:name=".Countries"
android:label="国家">
</activity>
<activity android:name=".Anything"
android:label="随便的信息">
</activity>
4. 所需要的各种代码和素材都已经准备好了,下面主Activity的代码(它所对应的布局文件,就用缺省的main.xml好了,这个无关紧要)
public class ControlMenuextends Activity
implements
OnMenuItemClickListener
{
private static final int MAIN_GROUP = 0;
private static final int GENDER_GROUP = 1;
private static final int SPORTS_GROUP = 2;
private static final int GENDER_GROUP_MALE = 3;
private static final int GENDER_GROUP_FEMALE = 4;
private static final int SPORTS_GROUP_BASKETBALL = 5;
private static final int SPORTS_GROUP_ICESKATE = 6;
private static final int SPORTS_GROUP_VOLLEYBALL = 7;
private static final int SPORTS_GROUP_BOXING = 8;
private static final int MENU_GENDER = 9;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public booleanonCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
// Menu可以增加MenuItem,很显然,menu_countries是一个Icon Menu Item
MenuItemmenu_countries = menu.add("国籍");
// 设定menu_countries的图标
menu_countries.setIcon(R.drawable.cn);
// 当menu_countries这个菜单项被点击后,就会跳转到Intent对象中第二个参数所指定的Activity
menu_countries.setIntent(new Intent(this, Countries.class));
//=========================================================
// Menu可以增加SubMenu。SubMenu可以认为是Menu的菜单项
SubMenusubMenuSports = menu.addSubMenu("体育");
// SubMenu本身可以有icon,但SubMenu的菜单项,则不支持icon
subMenuSports.setIcon(R.drawable.tableball);
// 设定SubMenu的HeaderIcon
subMenuSports.setHeaderIcon(R.drawable.usfootball);
// SubMenu可以增加MenuItem(即SubMenu的菜单项)
// public abstract MenuItem add (intgroupId, int itemId, int order, CharSequence title)
// add的第3个参数决定菜单项的先后顺序,越小排位越靠前,如果不关心菜单项的排列顺序,
// 可以让这个参数为Menu.NONE(即0)
MenuItemmenu_basketball = subMenuSports.add(SPORTS_GROUP, SPORTS_GROUP_BASKETBALL, Menu.NONE, "篮球");
MenuItemmenu_volleyball = subMenuSports.add(SPORTS_GROUP, SPORTS_GROUP_VOLLEYBALL, Menu.NONE, "排球");
MenuItem menu_iceskate =subMenuSports.add(SPORTS_GROUP, SPORTS_GROUP_ICESKATE, Menu.NONE, "滑冰");
MenuItemmenu_boxing = subMenuSports.add(SPORTS_GROUP, SPORTS_GROUP_BOXING, Menu.NONE, "拳击");
// setGroupCheckable的第2个参数,表示整个菜单组里面的菜单项是否可以checkable
// setGroupCheckable的第3个参数,表示菜单项的选择是否为exclusive
// 如果是true,则表明是exclusive的,即排他的,也就是每个菜单项是以单选按钮的形式出现的
// 如果是false,则表明是非exclusive的,即可以多选,也就是每个菜单项是以checkbox的形式出现的
subMenuSports.setGroupCheckable(SPORTS_GROUP, true, false);
menu_basketball.setChecked(true);
//menu_basketball.setIcon(R.drawable.basketball); // SubMenu的菜单项,即使设置了Icon,也不会显示
menu_basketball.setOnMenuItemClickListener(this);
menu_volleyball.setChecked(true);
//menu_volleyball.setIcon(R.drawable.volleyball); // SubMenu的菜单项,即使设置了Icon,也不会显示
menu_volleyball.setOnMenuItemClickListener(this);
menu_iceskate.setChecked(false);
//menu_iceskate.setIcon(R.drawable.iceskate); // SubMenu的菜单项,即使设置了Icon,也不会显示
menu_iceskate.setOnMenuItemClickListener(this);
menu_boxing.setChecked(false);
//menu_boxing.setIcon(R.drawable.boxing); //SubMenu的菜单项,即使设置了Icon,也不会显示
menu_boxing.setOnMenuItemClickListener(this);
// ===========================================================================================
MenuItemmenu_anything = menu.add("爱好");
menu_anything.setIcon(R.drawable.boxing);
menu_anything.setIntent(new Intent(this, Anything.class));
//设置快捷键
menu_anything.setAlphabeticShortcut('H');
// ===========================================================================================
SubMenusubMenuGender = menu.addSubMenu(MAIN_GROUP, MENU_GENDER, 0, "性别");
subMenuGender.setIcon(R.drawable.us);
subMenuGender.setHeaderIcon(R.drawable.us);
// add的第3个参数决定菜单项的先后顺序,越小排位越靠前,如果不关心菜单项的排列顺序,
// 可以让这个参数为Menu.NONE(即0),下面的代码是会"女"菜单项在"男"菜单项之前。
MenuItem male = subMenuGender.add(GENDER_GROUP, GENDER_GROUP_MALE, 2, "男");
male.setChecked(true);
male.setOnMenuItemClickListener(this);
MenuItem female =subMenuGender.add(GENDER_GROUP, GENDER_GROUP_FEMALE, 1, "女");
female.setChecked(false);
female.setOnMenuItemClickListener(this);
// setGroupCheckable的第2个参数,表示整个菜单组里面的菜单项是否可以checkable
// setGroupCheckable的第3个参数,表示菜单项的选择是否为exclusive
// 如果是true,则表明是exclusive的,即排他的,也就是每个菜单项是以单选按钮的形式出现的
subMenuGender.setGroupCheckable(GENDER_GROUP, true, true);
// ============================================================================================
// 定义一个Icon Menu Item(该菜单项不处理任何事件,仅为了让Icon Menu Item超过6个,从而出现“More”)
MenuItemmenu_anything3 = menu.add("学位");
menu_anything3.setIcon(R.drawable.iceskate);
// ============================================================================================
// 定义一个Icon Menu Item(该菜单项不处理任何事件,仅为了让Icon Menu Item超过6个,从而出现“More”)
MenuItemmenu_anything4 = menu.add("语言"); // 前面5个Icon MenuItem加上More,因此Icon MenuItem会超过6个,
menu_anything4.setIcon(R.drawable.hk); // 所以menu_anything4,会变成Expanded Menu,也就是说,给它设置
// 图标是没有意义的
// ============================================================================================
MenuItemmenu_anything5 = menu.add("才艺"); // 也会变成Expanded Menu
menu_anything5.setIcon(R.drawable.compass); // 设置图标是没有意义的
menu_anything5.setIntent(new Intent(this, Anything.class)); // 跳转到Anything这个Activity
return true;
}
// OnMenuItemClickListener接口要求我们实现onMenuItemClick方法
public boolean onMenuItemClick(MenuItem item)
{
// 功能示例
// 如果item是checked状态,那么点击它以后,就会变成unchecked状态。反之亦然。
if(item.isChecked())
{
item.setChecked(false);
}
if(!item.isChecked())
{
item.setChecked(true);
}
return true;
}
// 重写Activity中的onOptionsItemSelected方法
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
String str = "";
// 如果点击的是体育这个菜单项
if(item.getTitle() == "体育")
{
// 检查各菜单项被选中的情况:
if(item.getSubMenu().findItem(SPORTS_GROUP_BASKETBALL).isChecked()) str+= "篮球 ";
if(item.getSubMenu().findItem(SPORTS_GROUP_VOLLEYBALL).isChecked()) str+= "排球 ";
if(item.getSubMenu().findItem(SPORTS_GROUP_ICESKATE).isChecked()) str += "滑冰 ";
if(item.getSubMenu().findItem(SPORTS_GROUP_BOXING).isChecked()) str += "拳击 ";
// 用Toast将checked的选项显示出来
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
运行结果:
a) 点击模拟器上的menu按钮
b) 点击More:
从上面可以看到,尽管我们给“语言”和“才艺”这两个菜单项,在代码中增加了Icon,但在这里是看不到的。也就是说Expanded Menu Item是不支持Icon的。
c) 在a)中点击“国籍”菜单项,将会切换到Activity Countries所拥有的界面,如下:
d) 在a)中点击“体育”菜单项(其实是一个SubMenu),得到:
因为subMenuSports.setGroupCheckable(SPORTS_GROUP,true, false);中的最后一个参数是false,所以显示的菜单项是Checkbox形式
e) 在a)中点击“爱好”菜单项,将会切换到Activity Anything所拥有的界面,如下:
在代码中,我们以menu_anything.setAlphabeticShortcut('H');形式为“爱好”菜单项添加了快捷键,因此,只要点击键盘上的“h”键,也会出现上述界面。这个特点在带有键盘的手机上应该比较有用,在没有键盘的手机上(用软键盘),尽管也可以起作用,但用处不大。
f) 在a)中点击“性别”菜单项(其实是个SubMenu),得到:
因为subMenuGender.setGroupCheckable(GENDER_GROUP,true, true);中的最后一个参数是true,所以菜单项显示的是Radio的形式。
请注意,代码中的Order对菜单项显示顺序的影响。
g) “学位”菜单项,我们没有添加相应的代码,因此点击它,不会有什么响应。
h) 点击“More”会得到b)中所示的ExpandedMenu Item,点击其中的“语言”菜单项,什么也不会发生,因为我们没有为这个菜单项增加对应的代码。
i) 点击“才艺”,和在a)中点击“爱好”菜单项一样,将会切换到Activity Anything所拥有的界面。
- AndroidGUI11:OptionsMenu的常用技巧
- android的OptionsMenu
- android中optionsmenu的创建
- android 关于OptionsMenu的应用
- OptionsMenu、SubMenu、ContextMenu的使用
- Android optionsMenu,菜单的使用
- OptionsMenu选项菜单的使用
- 不同的fragment 使用不同的OptionsMenu
- Android添加optionsmenu的两种方法
- android之OptionsMenu功能菜单的使用
- android -- ContextMenu 的使用 和 OptionsMenu 区别
- ContextMenu 的使用 和 OptionsMenu 区别
- OptionsMenu按钮不显示的解决方法
- CSS的常用技巧
- CSS的常用技巧
- CSS的常用技巧
- 常用的网页技巧
- CSS的常用技巧
- How to install ASP.NET 1.1 with IIS7 on Vista and Windows 2008
- 根据时间进行查询
- 转:S3C6410中断控制详解
- 在Ubuntu 10.04.2 LTS上安装 Oracle SQL Developer3.0 (3.0.04.34)
- C++变量在栈上的布局
- AndroidGUI11:OptionsMenu的常用技巧
- 策略模式
- Oracle Connect By用法
- Perl的library设置
- 3dsmax模型导出插件调试技巧
- 游戏程序中的骨骼插件
- vim shell
- El表达式 empty用法
- C++内存泄漏问题务必要避免!