`

Android UI学习 - Menu

 
阅读更多

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,boolean checkable,boolean exclusive):设置菜单是否可选中。最后一个exclusive是指是单选还是多选,当exclusive是true时,系统将菜单前面添加单选 框,是false时则变成是checkbox多选框。

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





效果图

Activity代码

Java代码收藏代码
  1. //定义选项菜单
  2. finalprivatestaticintOPTION_MENU_HELP=3;//菜单[帮助]的编号
  3. finalprivatestaticintOPTION_MENUS_GROUP0=0;//菜单组0#
  4. finalprivatestaticintOPTION_MENUS_GROUP1=1;//菜单组1#
  5. finalprivatestaticintOPTION_MENUS_GROUP2=2;//菜单组2#
  6. privateMenuEntity[]optionMenus={
  7. newMenuEntity(OPTION_MENUS_GROUP0,1,1,"删除",android.R.drawable.ic_menu_delete),
  8. newMenuEntity(OPTION_MENUS_GROUP0,2,2,"保存",android.R.drawable.ic_menu_edit),
  9. newMenuEntity(OPTION_MENUS_GROUP0,3,3,"帮助",android.R.drawable.ic_menu_help),
  10. newMenuEntity(OPTION_MENUS_GROUP0,4,4,"添加",android.R.drawable.ic_menu_add),
  11. newMenuEntity(OPTION_MENUS_GROUP1,5,5,"详细",android.R.drawable.ic_menu_info_details),
  12. newMenuEntity(OPTION_MENUS_GROUP1,6,6,"发送",android.R.drawable.ic_menu_send),
  13. newMenuEntity(OPTION_MENUS_GROUP1,7,7,"电话",android.R.drawable.ic_menu_call),
  14. newMenuEntity(OPTION_MENUS_GROUP1,8,8,"照相",android.R.drawable.ic_menu_camera),
  15. };
  16. //定义选项菜单[帮助]的子菜单
  17. privateMenuEntity[]helpSubMenus={
  18. newMenuEntity(OPTION_MENUS_GROUP2,9,1,"LiveHelp",android.R.drawable.ic_menu_delete),
  19. newMenuEntity(OPTION_MENUS_GROUP2,10,2,"Email",android.R.drawable.ic_menu_edit),
  20. newMenuEntity(OPTION_MENUS_GROUP2,11,2,"Phone",android.R.drawable.ic_menu_edit),
  21. };
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main_list_view);
  26. }
  27. /**
  28. *读取选中点击的菜单
  29. *@paramindex
  30. *@return
  31. */
  32. publicStringreadOptionsMenu(intindex){
  33. for(inti=0;i<optionMenus.length;i++){
  34. if(optionMenus[i].getItemId()==index)returnoptionMenus[i].getTitle().toString();
  35. }
  36. for(inti=0;i<helpSubMenus.length;i++){
  37. if(helpSubMenus[i].getItemId()==index)returnhelpSubMenus[i].getTitle().toString();
  38. }
  39. return"";
  40. }
  41. @Override
  42. publicbooleanonCreateOptionsMenu(Menumenu){//创建选项菜单
  43. for(MenuEntitymenuEntity:optionMenus){
  44. if(OPTION_MENU_HELP==menuEntity.getItemId()){
  45. //菜单[帮助]增加子菜单
  46. SubMenusubMenu=menu.addSubMenu(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle()).setIcon(menuEntity.getIconRes());
  47. for(MenuEntitysubMenuEntity:helpSubMenus){
  48. subMenu.add(subMenuEntity.getGroupId(),subMenuEntity.getItemId(),subMenuEntity.getOrder(),subMenuEntity.getTitle()).setIcon(subMenuEntity.getIconRes());
  49. }
  50. }else{
  51. menu.add(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle()).setIcon(menuEntity.getIconRes());
  52. }
  53. }
  54. returnsuper.onCreateOptionsMenu(menu);
  55. }
  56. @Override
  57. publicbooleanonOptionsItemSelected(MenuItemitem){
  58. intitemId=item.getItemId();
  59. Toast.makeText(context,"menu["+itemId+":"+item.getTitle()+"]被点击了",Toast.LENGTH_SHORT).show();
  60. returnsuper.onOptionsItemSelected(item);
  61. }
  62. @Override
  63. publicvoidonOptionsMenuClosed(Menumenu){
  64. Toast.makeText(context,"OptionsMenu被关闭了",Toast.LENGTH_SHORT).show();
  65. super.onOptionsMenuClosed(menu);
  66. }

备注

Java代码收藏代码
  1. privateMenuEntity[]optionMenus={
  2. newMenuEntity(OPTION_MENUS_GROUP0,1,1,"删除",android.R.drawable.ic_menu_delete),
  3. newMenuEntity(OPTION_MENUS_GROUP0,2,2,"保存",android.R.drawable.ic_menu_edit),
  4. newMenuEntity(OPTION_MENUS_GROUP0,3,3,"帮助",android.R.drawable.ic_menu_help),
  5. newMenuEntity(OPTION_MENUS_GROUP0,4,4,"添加",android.R.drawable.ic_menu_add),
  6. newMenuEntity(OPTION_MENUS_GROUP1,5,5,"详细",android.R.drawable.ic_menu_info_details),
  7. newMenuEntity(OPTION_MENUS_GROUP1,6,6,"发送",android.R.drawable.ic_menu_send),
  8. newMenuEntity(OPTION_MENUS_GROUP1,7,7,"电话",android.R.drawable.ic_menu_call),
  9. newMenuEntity(OPTION_MENUS_GROUP1,8,8,"照相",android.R.drawable.ic_menu_camera),
  10. };
  11. //定义选项菜单[帮助]的子菜单
  12. privateMenuEntity[]helpSubMenus={
  13. newMenuEntity(OPTION_MENUS_GROUP2,9,1,"LiveHelp",android.R.drawable.ic_menu_delete),
  14. newMenuEntity(OPTION_MENUS_GROUP2,10,2,"Email",android.R.drawable.ic_menu_edit),
  15. newMenuEntity(OPTION_MENUS_GROUP2,11,2,"Phone",android.R.drawable.ic_menu_edit),
  16. };

其中的

Java代码收藏代码
  1. MenuEntity

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

附录一 : 调用方法removeGroup(int group)

Java代码收藏代码
  1. @Override
  2. publicbooleanonCreateOptionsMenu(Menumenu){//创建选项菜单
  3. for(MenuEntitymenuEntity:optionMenus){
  4. if(OPTION_MENU_HELP==menuEntity.getItemId()){
  5. //菜单[帮助]增加子菜单
  6. SubMenusubMenu=menu.addSubMenu(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle()).setIcon(menuEntity.getIconRes());
  7. for(MenuEntitysubMenuEntity: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);//移除全部group为1的菜单
  15. returnsuper.onCreateOptionsMenu(menu);
  16. }


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

附录二 : 调用方法setGroupEnabled(int group, boolean enabled)

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

Java代码收藏代码
  1. @Override
  2. publicbooleanonCreateOptionsMenu(Menumenu){//创建选项菜单
  3. for(MenuEntitymenuEntity:optionMenus){
  4. if(OPTION_MENU_HELP==menuEntity.getItemId()){
  5. //菜单[帮助]增加子菜单
  6. SubMenusubMenu=menu.addSubMenu(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle()).setIcon(menuEntity.getIconRes());
  7. for(MenuEntitysubMenuEntity: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);//关闭group为1的菜单
  15. returnsuper.onCreateOptionsMenu(menu);
  16. }




group为1的菜单项变灰了

2011-06-15 0:51
研究了下Menu菜单图标改变是否会自动刷新 - synge33 - Melancholy斐研究了下Menu菜单图标改变是否会自动刷新 - synge33 - Melancholy斐

package com.test.menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.*;

public class testmenuActivity extends Activity {
 public static final int ITEM0 = Menu.FIRST;
 public static final int ITEM1 = Menu.FIRST+1;
 Button button1;
 Button button2;
 MenuItem item;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button1.setVisibility(View.INVISIBLE);
        button2.setVisibility(View.INVISIBLE);
    }
    
    public boolean onCreateOptionsMenu(Menu menu){
     super.onCreateOptionsMenu(menu);
     menu.add(0, ITEM0, 0, "显示button1");
     menu.add(0, ITEM1, 1, "显示button2");
     menu.findItem(ITEM1);
     item = (MenuItem) menu.findItem(ITEM0);
     return true;
    }
    
    public boolean onOptionsItemSelected(MenuItem item){
     switch (item.getItemId()){
     case ITEM0:
      actionClickMenuItem1();
      bool = false;
     break;
     case ITEM1:
      actionClickMenuItem2();
      bool = true;
     break;
     }
     
     return super.onOptionsItemSelected(item);
    }
    /*
     *点击第一个menu的第一个按钮执行的动作; 
     */
    private void actionClickMenuItem1(){
     setTitle("button1 可见");
     button1.setVisibility(View.INVISIBLE);
     button2.setVisibility(View.VISIBLE);
     item.setIcon(R.drawable.menu_start);
    }
    /*
     *点击第一个menu的第一个按钮执行的动作; 
     */
    private void actionClickMenuItem2(){
     setTitle("button2 可见");
     button2.setVisibility(View.INVISIBLE);
     button1.setVisibility(View.VISIBLE);
     item.setIcon(R.drawable.menu_end);
    }
}

 



分享到:
评论

相关推荐

    Android---UI篇

    •Android---UI篇---Tab Layout(选项卡布局) • •Andorid---UI篇---TableLayout(表格布局) • •Android---UI篇---RelativeLayout(相对布局) • •Android---UI篇---GridView...•Android---UI篇---Menu(菜单)

    Android---UI篇---Menu(菜单)

    在Android开发中,UI设计是至关重要的一环,而Menu(菜单)则是提升用户体验的重要组成部分。本文将详细探讨Android系统中的三种菜单类型:Options Menu、Context Menu和SubMenu。 首先,我们来了解一下Options ...

    android-snake-menu-炫酷动画菜单.zip

    "android-snake-menu-炫酷动画菜单"是一个开源项目,旨在为开发者提供一种创新的菜单展示方式,通过独特的动画效果提升应用的交互性。该项目由GitHub用户xmuSistone创建,其代码仓库位于...

    Android-circular-menu-example-源码.rar

    "Android-circular-menu-example-源码.rar" 这个标题表明这是一个关于Android平台的项目,具体是一个圆形菜单的示例代码。"源码"一词提示我们,我们将探讨的是开发者级别的内容,涉及到编程语言、设计模式以及...

    Side-Menu.Android-master.rar

    【标题】"Side-Menu.Android-master.rar"是一个与Android UI设计相关的开源项目,它在GitHub上可供开发者们学习和使用。这个压缩包包含了名为"Side-Menu.Android-master"的源代码,通常这样的命名方式表示这是一个...

    Side-Menu.android

    "Side-Menu.android" 是一个专为Android平台设计的侧滑菜单库,由知名UI/UX设计公司Yalantis打造,它提供了美观且带有动画效果的上下文菜单。这个库使得开发者能够轻松地将这种高级交互功能集成到自己的应用程序中。...

    android-support-v7-appcompat.jar android-support-v4.jar

    此外,它还包含了一些其他UI控件和功能,如ToolBar、OptionsMenu等。 `android-support-v4.jar` 则是另一个广泛使用的库,它包含了大量在Android 4.0(API级别14)及更高版本中可用的功能,但向下兼容到Android 1.6...

    Side-Menu.Android-master.zip

    Side-Menu.Android-master.zip 是一个Android开发相关的压缩包,它包含了一个实现侧滑菜单的开源项目。这个项目由知名UI设计公司Yalantis创建,旨在为Android应用提供一种美观且功能丰富的侧滑菜单解决方案。侧滑...

    android-support-v7.jar

    `android-support-v7-appcompat`库支持在ActionBar或ToolBar中显示菜单和选项项,同时提供了对Overflow Menu(更多选项)的支持,即使在没有硬件菜单键的设备上也能正常使用。 六、颜色选择器 库中还包括一个颜色...

    Android UI之样式Menu

    在Android开发中,UI设计是用户体验的关键组成部分,而Menu作为一种重要的交互元素,常常用于实现应用程序中的下拉选项或操作选项。本教程将深入探讨如何在Android中创建炫酷的弹出菜单,让你的应用脱颖而出。 首先...

    Context-Menu.Android源码

    通过研究这个源码,开发者不仅可以学习到如何在Android应用中实现自定义上下文菜单,还能了解到Android UI组件的使用、事件处理机制以及如何优化和扩展应用功能。这将对提升Android开发技能大有裨益。

    android-support-v7-appcompat.rar

    `android-support-v7-appcompat`引入了对ActionBar的支持,这是Android 3.0(Honeycomb)引入的一个关键UI元素。通过这个库,开发者可以在API Level 7及以上的所有版本中使用ActionBar,提供导航、操作和应用品牌等...

    Android--UI-新手必备源码master.zip

    包括Android布局,弹窗,配色,单击事件,UI,精美炫酷的activity切换动画和空间动画,是新手必备的源码,内含相关的Dome 25件。 - - 文件夹 PATH 列表 卷序列号为 4E8D-6931 C:. │ .txt │ Android-UI-新手必备...

    android-menudrawer-master menu drawer 滑动式菜单

    通过深入研究`android-menudrawer-master`项目的源代码,开发者不仅可以了解滑动菜单的实现原理,还能学习到如何优化Android UI组件的性能和用户体验。这个项目对于那些希望在自己的应用中集成滑动菜单的开发者来说...

    android各组件详解- Menu

    在Android应用程序开发中,Menu(菜单)是一项重要的UI组件,它可以帮助用户快速访问应用内的功能或设置。根据应用场景的不同,Android系统提供了三种类型的菜单:OptionsMenu、ContextMenu以及SubMenu。 1. **...

    MySide-Menu:模仿Side-Menu-Android项目,实现在控件里

    在【MySide-Menu-master】这个压缩包中,你可能找到以下内容: - `src`: 源代码目录,包含项目的Java类和相关的布局文件。 - `res`: 资源文件夹,包括XML布局文件、图片资源、字符串资源等。 - `build.gradle`: ...

    material-menuAndroid.zip

    【material-menuAndroid.zip】是一个与Android用户界面设计相关的压缩包,其内容主要涉及一个名为"material-menu"的库,该库提供了炫酷的动画效果,用于实现类似Android系统中的菜单、返回和删除按钮的交互。...

    五、Android用户界面(UI)-Android开发与实践

    【Android用户界面(UI)开发详解】 在Android开发中,用户界面(UI)设计是至关重要的,因为它直接影响到用户的体验和应用程序的易用性。...不断学习和实践,将有助于提升Android UI设计和开发的专业技能。

    circle-menu-android.zip

    "circle-menu-android"项目提供了一种简单且优雅的UI菜单解决方案,它采用圆形布局和符合材料设计规范的动画效果,为开发者提供了丰富的交互体验。下面我们将深入探讨这一技术的实现原理及其实用价值。 1. **圆形...

Global site tag (gtag.js) - Google Analytics