ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 16766|回复: 0
上一主题 下一主题
[教程]

《Android Dev Guide》系列教程11:用户界面之Menu菜单特性

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-28 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
>
这里有一些大多数菜单项都有的特性   
   
当我们添加新的条目到一个菜单中,你可以让所有条目包含在一个组中,菜单组是菜单条目的集合,里面的菜单那项可以共享某些特性,比如是否可见、可用、可选。   
一个菜单组被定义为整形(或者在xml中配置一个资源id),往menu中使用add()方法添加菜单项时,如果参数中包含了菜单组的id,那么这个条目会添加到相应的菜单组中。比如add(int,int,int,int)。使用setGroupVisible()方法可以设置整个组是否隐藏。setGroupEnabled()发那个发设置整个组是否可用,setGroupCheckable()设置整个组是否可选。   
   
     
任何菜单项都有是否可选的接口。可以是一个独立的选择框、单选框、单选按钮复选框,参考上面截图。   
注意:在Icon菜单中,菜单项不能显示为但则狂或者单选按钮。如果你想在icon菜单中让条目可选,必须自己在状态改变时改变条目的现实。   
想让一个条目可选,可以使用setCheckable()方法,像这样。   
   
   
  1. view plaincopy to clipboardprint?   
    menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate")     
        .setCheckable(true);  
复制代码
这样会显示一个选择框(前提是他不是一个icon菜单),当条目被选中时,onOptionsItemSelected()回调方法会被调用。这里你必须设置选择框的状态,你可以使用isChecked()查询当前状态或者使用setChecked()方法设置状态。类似于onOptionsItemsSelected()方法。
   
  1. view plaincopy to clipboardprint?   
    switch (item.getItemId()) {     
    case VIBRATE_SETTING_ID:     
      if (item.isChecked()) item.setChecked(false);     
      else item.setChecked(true);     
      return true;     
    ...     
    }
复制代码
如果想让几个radio选择按钮成为一个单选按钮组,可以设置相同的groupId,然后调用setGroupCheckable()方法即可。这种情况下,不用每个item都调用setCheckable()方法,下面是一个子菜单中的两个单选按钮组:
   
  1. view plaincopy to clipboardprint?   
    SubMenu subMenu = menu.addSubMenu("Color");     
    subMenu.add(COLOR_MENU_GROUP, COLOR_RED_ID, 0, "Red");     
    subMenu.add(COLOR_MENU_GROUP, COLOR_BLUE_ID, 0, "Blue");     
    subMenu.setGroupCheckable(COLOR_MENU_GROUP, true, true);  
复制代码
在setGroupCheckable()方法中,第一个参数为要设置的groupId,第二个为菜单项是否可选,最后一个参数是是否为单选(设为false的则所有item选择情况相互独立,即可以多选),当group设为单选时,每一次有条目被选中时,其他选项自动设置为未选状态(即单选)。注意:可选菜单按钮是基于会话的,其状态、结果并不会保存在设备上。如截图所示:在地图程序中的设置并不会保存。如果你想把设置的记过保存,可以使用Preferences累,并且使用PreferencesActivity类来管理他们。使用setAlphabeticShortcut(char)方法,可以给菜单项中添加快捷键,使用setNumericShortcut(int)可以设置数字快捷键,或者使用setShortCut(char,int)。大小写不敏感,例如:
   
  1. view plaincopy to clipboardprint?   
    menu.add(0, MENU_QUIT, 0, "Quit")     
        .setAlphabeticShortcut(q);  
复制代码
现在,当菜单打开时,或者按下menu键时,按下q键将会选择这个条目。这个快捷键会当成菜单项的一个小提示来显示,在菜单项标签的下面(icon菜单除外)。注意:快捷键不能加载Context菜单中。如果你阅读了以前的章节,你会对Android Intents有所熟悉,它允许应用程序绑定到其他程序上,共享信息,各个任务间通信。就像你的程序可以启动一个web浏览器、或者email客户端或者其他的activity,你可以在一个菜单中运行它们。有两种方式:为每个菜单项定义一个intent;或者定义intent然后允许Android自动搜索activity,并为每个符合条件的activity添加菜单项。关于建立intents和为程序提供服务的详细信息,可以参考Intents and Intent Filter 章节为单独的菜单项设置intent如果你想让一个菜单项运行一个新的activity,那么你需要调用菜单项的setIntent()方发来定义intent。例如,在onCreateOptionMenu()里,你可以这样定义:
   
  1. view plaincopy to clipboardprint?   
    MenuItem menuItem = menu.add(0, PHOTO_PICKER_ID, 0, "Select Photo");     
    menuItem.setIntent(new Intent(this, PhotoPicker.class));  
复制代码
当点击菜单项时,android 会自动运行设置好的activity。注意:这种运行方式不会返回数据,如果你想得到返回数据,那么不能使用setIntent()方法。你应该在onOptionsMenuItemSelected()方法或onContextMenuItemSelected()方法中调用startActivityForResult()方法。当前程序或者当前选项有可能会关联很多的activity,所以程序便可以动态的添加菜单项来执行那些操作。在创建menu菜单时,根据当前选定项的MIME类型,来使用Intent.ALTERNATIVE_CATEGORY或者Intent.SELECTED_ALTERNATIVE这两个参数来设置intent的分类,或者其他的参数来让intent filter (intent过滤器)启动一个新的acticity。然后调用addIntentOptions()来让android搜索到符合要求的服务并且添加到menu菜单中。如果没有合适的相应程序则菜单不添加条目。注意:SELECTED_ALTERNATIVE 处理当前屏幕里选中项,所以,之有当在onCreateContextMenu()方法和onPrepareOptionsMenu()方法里建立菜单时时才能使用。下面的例子,展示了程序怎样找到额外的服务来显示到菜单中。
   
  1. view plaincopy to clipboardprint?   
    public boolean onCreateOptionsMenu(Menu menu){     
        super.onCreateOptionsMenu(menu);     
        // Create an Intent that describes the requirements to fulfill, to be included     
        // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.      
        Intent intent = new Intent(null, getIntent().getData());     
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);     
                
        // Search for, and populate the menu with, acceptable offering applications.     
        menu.addIntentOptions(     
             thisClass.INTENT_OPTIONS,  // Menu group      
             0,      // Unique item ID (none)     
             0,      // Order for the items (none)     
             this.getComponentName(),   // The current Activity name     
             null,   // Specific items to place first (none)     
             intent, // Intent created above that describes our requirements     
             0,      // Additional flags to control items (none)     
             null);  // Array of MenuItems that correlate to specific items (none)     
        return true;     
    }  
复制代码
当activity发现有合适的intent过滤器时,便会添加一个相应的menu菜单项,菜单项会显示lable标签的内容。addIntentOptions()方法会返回添加的菜单项的个数。必须注意:当addIntentOptions()方法被调用时,他将会覆盖第一个参数所指定菜单里的所有项。如果你想为其他菜单提供服务,你只需要定义一个intent filter,只要再<category>标签里包含 ALTERNATIVE 或者 SELECTED_ALTERNATIVE 即可,例如:
   
  1. view plaincopy to clipboardprint?   
    <intent-filter label="Resize Image">     
        ...     
        <category android:name="android.intent.category.ALTERNATIVE" />     
        <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />     
        ...     
    </intent-filter>  
复制代码
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

上一篇:《Android Dev Guide》系列教程13:用户界面之UI事件的处理
下一篇:《Android Dev Guide》系列教程10:用户界面之创建菜单
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2025-7-27 09:48 , Processed in 0.059571 second(s), 15 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2025 ZNDS.Com

快速回复 返回顶部 返回列表