创建选项菜单(Options Menu)

转载地址:http://book.51cto.com/art/201108/281918.htm

6.1.1  创建选项菜单(Options Menu)

Activity类的onCreateOptionsMenu事件方法用来创建选项菜单,该方法的定义如下:

  
  
  
  
  1. public boolean onCreateOptionsMenu(Menu menu); 

一般需要将创建选项菜单的代码放在onCreateOptionsMenu方法中。通过Menu.add方法可以添加一个选项菜单项。该方法有4种重载形式,它们的定义如下:

  
  
  
  
  1. public MenuItem add(int titleRes);  
  2. public MenuItem add(CharSequence title);  
  3. public MenuItem add(int groupId, int itemId,  int order, int titleRes);  
  4. public MenuItem add(int groupId, int itemId,  int order, CharSequence title); 

add方法最多有4个参数,这些参数的含义如下。

groupId:菜单项的分组ID,该参数一般用于带选项按钮的菜单(将在后面详细介绍)。参数值可以是负整数、0和正整数。

itemId:当前添加的菜单项的ID。该参数值可以是负整数、0和正整数。

order:菜单显示顺序。Android系统在显示菜单项时,根据order参数的值按升序从左到右、从上到下显示菜单项。参数值必须是0和正整数,不能为负整数。

titleRes或title:菜单项标题的字符串资源ID或字符串。

如果使用add方法的前两种重载形式,groupId、itemId和order三个参数的值都为0。这时菜单项的显示顺序就是菜单项的添加顺序。下面的代码添加了3个选项菜单项:

  
  
  
  
  1. public boolean onCreateOptionsMenu(Menu menu)  
  2. {  
  3.     menu.add(1, 1, 1, "菜单项1");  
  4.     menu.add(1, 2, 2, "菜单项2");  
  5.     menu.add(1, 3, 3, "菜单项3");  
  6.     return true;  
  7. }  

Android的选项菜单最多显示6个菜单项,如果不足6个菜单项,可根据实际情况来排列,例如,在有5个菜单项的情况下,第1行会显示两个菜单项,第2行会显示3个菜单项,如图6.1所示。如果菜单项超过6个,系统会显示前5个菜单项,而最后一个菜单项的文本是"更多"或"More",如图6.2所示。单击该菜单项后,会显示其余的菜单项。如果菜单项的文本过长,系统会显示三行两列的选项菜单,而不是如图6.2所示的两行三列的选项菜单,而且过长的标题会从左到右移动显示。

创建选项菜单(Options Menu)_第1张图片 
图6.1  有5个菜单项的选项菜单

6.1.1  创建选项菜单(Options Menu)

Activity类的onCreateOptionsMenu事件方法用来创建选项菜单,该方法的定义如下:

  
  
  
  
  1. public boolean onCreateOptionsMenu(Menu menu); 

一般需要将创建选项菜单的代码放在onCreateOptionsMenu方法中。通过Menu.add方法可以添加一个选项菜单项。该方法有4种重载形式,它们的定义如下:

  
  
  
  
  1. public MenuItem add(int titleRes);  
  2. public MenuItem add(CharSequence title);  
  3. public MenuItem add(int groupId, int itemId,  int order, int titleRes);  
  4. public MenuItem add(int groupId, int itemId,  int order, CharSequence title); 

add方法最多有4个参数,这些参数的含义如下。

groupId:菜单项的分组ID,该参数一般用于带选项按钮的菜单(将在后面详细介绍)。参数值可以是负整数、0和正整数。

itemId:当前添加的菜单项的ID。该参数值可以是负整数、0和正整数。

order:菜单显示顺序。Android系统在显示菜单项时,根据order参数的值按升序从左到右、从上到下显示菜单项。参数值必须是0和正整数,不能为负整数。

titleRes或title:菜单项标题的字符串资源ID或字符串。

如果使用add方法的前两种重载形式,groupId、itemId和order三个参数的值都为0。这时菜单项的显示顺序就是菜单项的添加顺序。下面的代码添加了3个选项菜单项:

  
  
  
  
  1. public boolean onCreateOptionsMenu(Menu menu)  
  2. {  
  3.     menu.add(1, 1, 1, "菜单项1");  
  4.     menu.add(1, 2, 2, "菜单项2");  
  5.     menu.add(1, 3, 3, "菜单项3");  
  6.     return true;  
  7. }  

Android的选项菜单最多显示6个菜单项,如果不足6个菜单项,可根据实际情况来排列,例如,在有5个菜单项的情况下,第1行会显示两个菜单项,第2行会显示3个菜单项,如图6.1所示。如果菜单项超过6个,系统会显示前5个菜单项,而最后一个菜单项的文本是"更多"或"More",如图6.2所示。单击该菜单项后,会显示其余的菜单项。如果菜单项的文本过长,系统会显示三行两列的选项菜单,而不是如图6.2所示的两行三列的选项菜单,而且过长的标题会从左到右移动显示。

创建选项菜单(Options Menu)_第2张图片 
图6.1  有5个菜单项的选项菜单

6.1.1  创建选项菜单(Options Menu)

Activity类的onCreateOptionsMenu事件方法用来创建选项菜单,该方法的定义如下:

  
  
  
  
  1. public boolean onCreateOptionsMenu(Menu menu); 

一般需要将创建选项菜单的代码放在onCreateOptionsMenu方法中。通过Menu.add方法可以添加一个选项菜单项。该方法有4种重载形式,它们的定义如下:

  
  
  
  
  1. public MenuItem add(int titleRes);  
  2. public MenuItem add(CharSequence title);  
  3. public MenuItem add(int groupId, int itemId,  int order, int titleRes);  
  4. public MenuItem add(int groupId, int itemId,  int order, CharSequence title); 

add方法最多有4个参数,这些参数的含义如下。

groupId:菜单项的分组ID,该参数一般用于带选项按钮的菜单(将在后面详细介绍)。参数值可以是负整数、0和正整数。

itemId:当前添加的菜单项的ID。该参数值可以是负整数、0和正整数。

order:菜单显示顺序。Android系统在显示菜单项时,根据order参数的值按升序从左到右、从上到下显示菜单项。参数值必须是0和正整数,不能为负整数。

titleRes或title:菜单项标题的字符串资源ID或字符串。

如果使用add方法的前两种重载形式,groupId、itemId和order三个参数的值都为0。这时菜单项的显示顺序就是菜单项的添加顺序。下面的代码添加了3个选项菜单项:

  
  
  
  
  1. public boolean onCreateOptionsMenu(Menu menu)  
  2. {  
  3.     menu.add(1, 1, 1, "菜单项1");  
  4.     menu.add(1, 2, 2, "菜单项2");  
  5.     menu.add(1, 3, 3, "菜单项3");  
  6.     return true;  
  7. }  

Android的选项菜单最多显示6个菜单项,如果不足6个菜单项,可根据实际情况来排列,例如,在有5个菜单项的情况下,第1行会显示两个菜单项,第2行会显示3个菜单项,如图6.1所示。如果菜单项超过6个,系统会显示前5个菜单项,而最后一个菜单项的文本是"更多"或"More",如图6.2所示。单击该菜单项后,会显示其余的菜单项。如果菜单项的文本过长,系统会显示三行两列的选项菜单,而不是如图6.2所示的两行三列的选项菜单,而且过长的标题会从左到右移动显示。

创建选项菜单(Options Menu)_第3张图片 
图6.1  有5个菜单项的选项菜单

6.1.2  带图像的选项菜单

从上一节中Add方法的定义可以看出,该方法返回了一个MenuItem对象,每一个MenuItem对象对应一个菜单项。可以通过MenuItem接口的相应方法来设置与菜单项相关的内容,例如,显示在菜单项上的图像。

在如图6.1所示的选项菜单中可以看到"删除"和"文件"菜单项都带有一个图像,这个图像需要通过MenuItem.setIcon方法来添加,该方法的定义如下:

  
  
  
  
  1. //  通过图像资源ID装载图像  
  2. public MenuItem setIcon(int iconRes);  
  3. //  通过Drawable对象装载图像  
  4. public MenuItem setIcon(Drawable icon);  

下面的代码设置了菜单项的图像:

  
  
  
  
  1. MenuItem deleteMenuItem = menu.add(1, 1, "删除");  
  2. deleteMenuItem.setIcon(R.drawable.delete);     //  设置“删除”菜单项的图像  

6.1.3  关联Activity

虽然可以通过代码显示一个Activity,但我们还有更简单的方法,就是直接将Activity与菜单项关联。做法非常简单,只需要使用MenuItem.setIntent方法指定一个Intent对象即可。setIntent方法的定义如下:

  
  
  
  
  1. public MenuItem setIntent(Intent intent); 

将一个Activity与菜单项关联后,单击该菜单项,系统会调用startActivity方法显示与菜单项关联的Activity。下面的代码将AddActivity与"添加"菜单项关联,单击"添加"菜单项,系统就会显示AddActivity。

  
  
  
  
  1. MenuItem addMenuItem = menu.add(1, 1, 1, "添加");  
  2. //  将AddActivity与“添加”菜单项进行关联  
  3. addMenuItem.setIntent(new Intent(this, AddActivity.class));  

注意 如果设置了菜单项的单击事件,并且单击事件返回true,则与菜单项关联的Activity将失效。也就是说,系统调用单击事件方法后,就不会再调用startActivity方法显示与菜单项关联的Activity了。

6.1.5  动态添加、修改和删除选项菜单

在很多Android系统中,需要在程序的运行过程中根据具体情况动态地对选项菜单进行处理,例如,增加菜单项、修改菜单项的标题和图像。实现这个功能的关键是获得描述选项菜单的Menu对象。

Activity类中的很多方法都可以获得Menu对象。例如, onCreateOptionsMenu方法的menu参数就是Menu类型,我们要做的就是在onCreateOptionsMenu方法中将Menu对象保存在类变量中。下面的代码动态地向选项菜单中添加了5个菜单项:

  
  
  
  
  1. public class Main extends Activity implements OnMenuItemClickListener,  
  2.         OnClickListener  
  3. {  
  4.     private Menu menu;  
  5.     private int menuItemId = Menu.FIRST;        //  Menu.FIRST的值是1  
  6.     @Override  
  7.     public void onClick(View view)  
  8.     {  
  9.         //  只有单击手机上的“Menu”按钮,onCreateOptionsMenu方法才会被调用,  
  10.         //  因此,如果不按“Menu”按钮,Main类的menu变量的值是null  
  11.         if (menu == null) return;  
  12.         // 向Activity菜单添加5个菜单项,菜单项的id从10开始  
  13.         for (int i = 10; i < 15; i++)  
  14.         {  
  15.             int id = menuItemId++;  
  16.             menu.add(1, id, id, "菜单" + i);  
  17.         }  
  18.     }  
  19.     @Override  
  20.     public boolean onCreateOptionsMenu(Menu menu)  
  21.     {  
  22.         this.menu = menu;            //  保存Menu变量  
  23.         return super.onCreateOptionsMenu(menu);  
  24.     }  
  25.     ... ...  
  26. }  

运行程序后,单击模拟器上的"Menu"按钮(为了调用onCreateOptionsMenu方法以获得Menu对象),然后单击"动态添加5个菜单项"按钮,再次单击模拟器上的"Menu"按钮,会看到选项菜单中最后一个"更多"或"More"菜单项,单击"更多"或"More"菜单项,将显示如图6.3所示的效果。

既然有了Menu对象,修改和删除指定的菜单项就变得非常容易了,读者可以使用Menu接口的相应方法来完成这些工作。

 
图6.3  动态添加的5个菜单项


你可能感兴趣的:(创建选项菜单(Options Menu))