AndroidGUI11:OptionsMenu的常用技巧

来源:互联网 发布:mac安装brew命令 编辑:程序博客网 时间:2024/06/06 01:46

Menu有几种形式:

1.    Context MenuContextMenu的菜单项(Menu Item)不支持快捷键,也不支持图标。

2.    Option Menu包含两种MenuIconMenuExpandedMenuIcon Menu的菜单项(MenuItem)是唯一支持IconMenuItem,也是唯一不支持CheckBoxRadio按钮的MenuItemExpandedMenu是一个竖直列表,当用户点击Icon Menu中的“more”菜单项时弹出。“More”菜单项,仅在IconMenu菜单项超过6个时才会出现。

3.    Sub Menu本身支持icon,但SubMenu的菜单项(Menu Item)不支持iconSubMenu也不支持嵌套的Sub Menu

 

本文仅讨论上面的23两种情况。ContextMenu将在另外一篇文章中讨论。

 

1.    首先将本项目要用到的一些图标资源,放入到res/drawable-mdpi文件夹下。

它们的文件名分别为:

cn.pnguk.pngus.pngau.pngch.png

它们的文件名分别为:

basketball.pngtableball.pngusfootball.pngvolleyball.pngboxing.pngcompass.pngfootball.pnggolf.pngiceskate.png

 

图片资源放到res/drawable-mdpi文件夹后,系统会自动为它们生成对应的ID号,比如为cn.png生成的IDR.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可以增加SubMenuSubMenu可以认为是Menu的菜单项

                   SubMenusubMenuSports = menu.addSubMenu("体育");

                   // SubMenu本身可以有iconSubMenu的菜单项则不支持icon

                   subMenuSports.setIcon(R.drawable.tableball);

                   // 设定SubMenuHeaderIcon

                   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("语言");      // 前面5Icon 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)

         {

                   // 功能示例

                   // 如果itemchecked状态那么点击它以后就会变成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 += "拳击 ";

                            // Toastchecked的选项显示出来

                            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所拥有的界面。

原创粉丝点击