关于 SubMenu

子菜单

子菜单就是将相同功能的分组进行多级显示的一种菜单。

创建子菜单的步骤:

1、  覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单

2、  调用SubMenu的add()方法,添加子菜单

3、  覆盖onContextItemSelected()方法,响应子菜单的单击事件

 

至于onCreateOptionsMenu()方法在前面已做过介绍,现在来看下Menu的addSubMenu()方法,与add()方法一样它有四个重载方法,参数也同出一辙。在这也就不再多说明了

public abstract SubMenu addSubMenu (intgroupId, int itemId, int order, CharSequence title)

 

public abstract SubMenu addSubMenu (intgroupId, int itemId, int order, int titleRes)

 

public abstract SubMenu addSubMenu (CharSequence title)

 

public abstract SubMenu addSubMenu (inttitleRes)

这四个函数的返回对象都是SubMenu,那么我们就来看下SubMenu吧,随便来了解它的一些属性及方法:

SubMenu是实现Menu的

比较常用的方法有:setHeaderIcon()、setHeaderTitle()

下面通过两个实例来熟悉下SubMenu

 

实例1:

[java] view plaincopyprint?

1.  package com.jiahui.activity;  

2.    

3.  import java.lang.reflect.Field;  

4.    

5.  import android.app.Activity;  

6.  import android.os.Bundle;  

7.  import android.view.Menu;  

8.  import android.view.MenuItem;  

9.  import android.view.SubMenu;  

10.   

11. public class SubMenuDemoActivity extends Activity {  

12.   

13.     private static final int ITEM1 = Menu.FIRST;  

14.     private static final int ITEM2 = Menu.FIRST + 1;  

15.   

16.     public void onCreate(Bundle savedInstanceState) {  

17.         super.onCreate(savedInstanceState);  

18.         setContentView(R.layout.main);  

19.     }  

20.   

21.     public boolean onCreateOptionsMenu(Menu menu) {  

22.   

23.         SubMenu file = menu.addSubMenu("文件");  

24.         SubMenu edit = menu.addSubMenu("编辑");  

25.           

26.         file.add(0, ITEM1, 0"新建");  

27.         file.add(0, ITEM2, 0"打开");  

28.         return true;  

29.     }  

30.   

31.     public boolean onOptionsItemSelected(MenuItem item) {  

32.         switch (item.getItemId()) {  

33.         case ITEM1:  

34.             setTitle("新建文件");  

35.             break;  

36.   

37.         case ITEM2:  

38.             setTitle("打开文件");  

39.             break;  

40.         }  

41.   

42.         return true;  

43.     }  

44.   

45. }  


效果:



实例2:

[java] view plaincopyprint?

1.  package com.jiahui.activity;  

2.    

3.  import android.app.Activity;  

4.  import android.os.Bundle;  

5.  import android.view.Menu;  

6.  import android.view.SubMenu;  

7.    

8.  public class SubMenuDemo_2Activity extends Activity {  

9.       

10.     private static final int UPLOAD=Menu.FIRST;  

11.       

12.     private static final int DOWNLOAD=Menu.FIRST+1;  

13.       

14.       

15.     private static final int SUB_UPLOAD_A=Menu.FIRST+2;  

16.     private static final int SUB_UPLOAD_B=Menu.FIRST+3;  

17.       

18.     public void onCreate(Bundle savedInstanceState) {  

19.         super.onCreate(savedInstanceState);  

20.         setContentView(R.layout.main);  

21.     }  

22.   

23.     @Override  

24.     public boolean onCreateOptionsMenu(Menu menu) {  

25.           

26.           

27.         SubMenu uploadSubMenu=menu.addSubMenu(0, UPLOAD, 0"上传");    

28.         uploadSubMenu.setIcon(R.drawable.upload);  

29.           

30.         uploadSubMenu.setHeaderIcon(R.drawable.upload);//设置子菜单的标题  

31.         uploadSubMenu.setHeaderTitle("上传参数设置");//设置子菜单的标题  默认为上传  

32.         uploadSubMenu.add(0, SUB_UPLOAD_A, 0"上传参数1");  

33.         uploadSubMenu.add(0, SUB_UPLOAD_B, 0"上传参数2");  

34.           

35.           

36.         SubMenu downloadSubMenu=menu.addSubMenu(0, DOWNLOAD, 0"下载");  

37.         downloadSubMenu.setIcon(R.drawable.download);  

38.           

39.         return super.onCreateOptionsMenu(menu);  

40.     }  

41.       

42.       

43.       

44. }  



 

 

效果:

 


 

Android 的菜单功能:

Android 菜单(SubMenu)

 


SubMenu(子菜单),是在选项菜单的基础上增加子菜单。

 

一个Menu对象可以拥有0或多个SubMenu,通过调用Menu.addSubMenu方法将SubMenu添加到当前Menu中。在SubMenu 添加MenuItem的方式和在Menu中添加MenuItem方式一样,因为SubMenu是Menu的子类,但是SubMenu里不能再添加 SubMenu。

 

 

Android提供了基于Group id管理多个MenuItem的方法。

removeGroup(int group):移除所有属于group的MenuItem。

setGroupEnable( int group ,boolean enable):批量开启或关闭整个组的MenuItem。

setGroupVisible( int group ,visible):批量显示或隐藏整个组的MenuItem。

setGroupCheckable( int group ,booleancheckable,boolean exclusive):设置菜单是否可选中。最后一个exclusive是指是单选还是多选,当exclusive是true时,系统将菜单前面添加单选 框,是false时则变成是checkbox多选框。

 

 

示例:(在选项菜单[帮助]上配置了三个子菜单[LiveHelp,Email,Phone])

 

 

 

Activity代码

Java代码  

1.      //定义选项菜单  

2.    final private static int OPTION_MENU_HELP = 3;//菜单[帮助]的编号   

3.    final private static int OPTION_MENUS_GROUP0 = 0;//菜单组0#  

4.    final private static int OPTION_MENUS_GROUP1 = 1;//菜单组1#  

5.    final private static int OPTION_MENUS_GROUP2 = 2;//菜单组2#  

6.    private MenuEntity[] optionMenus = {  

7.         new MenuEntity(OPTION_MENUS_GROUP0, 11"删除",android.R.drawable.ic_menu_delete),  

8.         new MenuEntity(OPTION_MENUS_GROUP0, 22"保存",android.R.drawable.ic_menu_edit),  

9.         new MenuEntity(OPTION_MENUS_GROUP0, 33"帮助",android.R.drawable.ic_menu_help),  

10.        new MenuEntity(OPTION_MENUS_GROUP0, 44"添加",android.R.drawable.ic_menu_add),  

11.        new MenuEntity(OPTION_MENUS_GROUP1, 55"详细",android.R.drawable.ic_menu_info_details),  

12.        new MenuEntity(OPTION_MENUS_GROUP1, 66"发送",android.R.drawable.ic_menu_send),  

13.        new MenuEntity(OPTION_MENUS_GROUP1, 77"电话",android.R.drawable.ic_menu_call),  

14.        new MenuEntity(OPTION_MENUS_GROUP1, 88"照相",android.R.drawable.ic_menu_camera),  

15.        };  

16.   //定义选项菜单[帮助]的子菜单  

17.   private MenuEntity[] helpSubMenus = {  

18.        new MenuEntity(OPTION_MENUS_GROUP2, 91"LiveHelp",android.R.drawable.ic_menu_delete),  

19.        new MenuEntity(OPTION_MENUS_GROUP2, 102"Email",android.R.drawable.ic_menu_edit),  

20.        new MenuEntity(OPTION_MENUS_GROUP2, 112"Phone",android.R.drawable.ic_menu_edit),  

21.        };  

22.  

23.@Override  

24.   public void onCreate(Bundle savedInstanceState) {  

25.       super.onCreate(savedInstanceState);  

26.       setContentView(R.layout.main_list_view);  

27.   }  

28.  

29./** 

30. * 读取选中点击的菜单 

31. * @param index 

32. * @return 

33. */  

34.public String readOptionsMenu(int index){  

35.    for(int i=0;i<optionMenus.length;i++){  

36.        if(optionMenus[i].getItemId()==index) return optionMenus[i].getTitle().toString();  

37.    }  

38.    for(int i=0;i<helpSubMenus.length;i++){  

39.        if(helpSubMenus[i].getItemId()==index) return helpSubMenus[i].getTitle().toString();  

40.    }  

41.    return "";  

42.}  

43.  

44.  

45.  

46.@Override  

47.public boolean onCreateOptionsMenu(Menu menu) {//创建选项菜单  

48.    for(MenuEntity menuEntity:optionMenus){  

49.        if(OPTION_MENU_HELP==menuEntity.getItemId()){  

50.            //菜单[帮助]增加子菜单  

51.            SubMenu subMenu = menu.addSubMenu(menuEntity.getGroupId(), menuEntity.getItemId(), menuEntity.getOrder(), menuEntity.getTitle()).setIcon(menuEntity.getIconRes());  

52.            for(MenuEntity subMenuEntity:helpSubMenus){  

53.                subMenu.add(subMenuEntity.getGroupId(), subMenuEntity.getItemId(), subMenuEntity.getOrder(), subMenuEntity.getTitle()).setIcon(subMenuEntity.getIconRes());  

54.            }  

55.        }else{  

56.            menu.add(menuEntity.getGroupId(), menuEntity.getItemId(), menuEntity.getOrder(), menuEntity.getTitle()).setIcon(menuEntity.getIconRes());  

57.        }  

58.    }  

59.    return super.onCreateOptionsMenu(menu);  

60.}  

61.  

62.@Override  

63.public boolean onOptionsItemSelected(MenuItem item) {  

64.    int itemId = item.getItemId();  

65.    Toast.makeText(context, "menu["+itemId+":"+item.getTitle()+"]被点击了", Toast.LENGTH_SHORT).show();  

66.    return super.onOptionsItemSelected(item);  

67.}  

68.  

69.  

70.  

71.@Override  

72.public void onOptionsMenuClosed(Menu menu) {  

73.    Toast.makeText(context, "OptionsMenu被关闭了", Toast.LENGTH_SHORT).show();  

74.    super.onOptionsMenuClosed(menu);  

75.}  

 

 

备注

 

Java代码  

1.    private MenuEntity[] optionMenus = {  

2.         new MenuEntity(OPTION_MENUS_GROUP0, 11"删除",android.R.drawable.ic_menu_delete),  

3.         new MenuEntity(OPTION_MENUS_GROUP0, 22"保存",android.R.drawable.ic_menu_edit),  

4.         new MenuEntity(OPTION_MENUS_GROUP0, 33"帮助",android.R.drawable.ic_menu_help),  

5.         new MenuEntity(OPTION_MENUS_GROUP0, 44"添加",android.R.drawable.ic_menu_add),  

6.         new MenuEntity(OPTION_MENUS_GROUP1, 55"详细",android.R.drawable.ic_menu_info_details),  

7.         new MenuEntity(OPTION_MENUS_GROUP1, 66"发送",android.R.drawable.ic_menu_send),  

8.         new MenuEntity(OPTION_MENUS_GROUP1, 77"电话",android.R.drawable.ic_menu_call),  

9.         new MenuEntity(OPTION_MENUS_GROUP1, 88"照相",android.R.drawable.ic_menu_camera),  

10.        };  

11.//定义选项菜单[帮助]的子菜单  

12.private MenuEntity[] helpSubMenus = {  

13.        new MenuEntity(OPTION_MENUS_GROUP2, 91"LiveHelp",android.R.drawable.ic_menu_delete),  

14.        new MenuEntity(OPTION_MENUS_GROUP2, 102"Email",android.R.drawable.ic_menu_edit),  

15.        new MenuEntity(OPTION_MENUS_GROUP2, 112"Phone",android.R.drawable.ic_menu_edit),  

16.        };  

 

其中的

Java代码  

1. MenuEntity  

参考 关于菜单基础属性的实体类

 

 

 

附录一调用方法 removeGroup(intgroup)

 

Java代码  

1. @Override  

2. public boolean onCreateOptionsMenu(Menu menu) {//创建选项菜单  

3.     for(MenuEntity menuEntity:optionMenus){  

4.         if(OPTION_MENU_HELP==menuEntity.getItemId()){  

5.             //菜单[帮助]增加子菜单  

6.             SubMenu subMenu = menu.addSubMenu(menuEntity.getGroupId(), menuEntity.getItemId(), menuEntity.getOrder(), menuEntity.getTitle()).setIcon(menuEntity.getIconRes());  

7.             for(MenuEntity subMenuEntity:helpSubMenus){  

8.                 subMenu.add(subMenuEntity.getGroupId(), subMenuEntity.getItemId(), subMenuEntity.getOrder(), subMenuEntity.getTitle()).setIcon(subMenuEntity.getIconRes());  

9.             }  

10.        }else{  

11.            menu.add(menuEntity.getGroupId(), menuEntity.getItemId(), menuEntity.getOrder(), menuEntity.getTitle()).setIcon(menuEntity.getIconRes());  

12.        }  

13.    }  

14.    menu.removeGroup(OPTION_MENUS_GROUP1);//移除全部group1的菜单  

15.    return super.onCreateOptionsMenu(menu);  

16.}  

 

 

 


如图所示:原group为1的菜单不显示了!

 

附录二调用方法 setGroupEnabled( int group, booleanenabled )

关闭或者开启组为group的全部菜单。(关闭:enabled =false,菜单项变灰,不能点;开启:enabled =false,菜单项正常,可以点)

Java代码  

1. @Override  

2. public boolean onCreateOptionsMenu(Menu menu) {//创建选项菜单  

3.     for(MenuEntity menuEntity:optionMenus){  

4.         if(OPTION_MENU_HELP==menuEntity.getItemId()){  

5.             //菜单[帮助]增加子菜单  

6.             SubMenu subMenu = menu.addSubMenu(menuEntity.getGroupId(), menuEntity.getItemId(), menuEntity.getOrder(), menuEntity.getTitle()).setIcon(menuEntity.getIconRes());  

7.             for(MenuEntity subMenuEntity:helpSubMenus){  

8.                 subMenu.add(subMenuEntity.getGroupId(), subMenuEntity.getItemId(), subMenuEntity.getOrder(), subMenuEntity.getTitle()).setIcon(subMenuEntity.getIconRes());  

9.             }  

10.        }else{  

11.            menu.add(menuEntity.getGroupId(), menuEntity.getItemId(), menuEntity.getOrder(), menuEntity.getTitle()).setIcon(menuEntity.getIconRes());  

12.        }  

13.    }  

14.    menu.setGroupEnabled(OPTION_MENUS_GROUP1, false);//关闭group1的菜单  

15.    return super.onCreateOptionsMenu(menu);  

16.}  

 



 



 

group1的菜单项变灰了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值