array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 【转】Pro Android学习笔记(三十):Menu(1):了解Menu - 爱码网

目录(?)[-]

  1. 创建Menu
    1. MenuItem的属性itemId
    2. MenuItem的属性groupId
    3. MenuItem的属性orderId
    4. MenuItem的属性可选属性
  2. Menu触发
    1. onOptionItemSelected
    2. Click Listener
    3. 使用Intent

每个Activity都关联一个且是唯一一个menu对象,当对该menu进行创建,将触发onCreateOptionsMenu()。

创建Menu

我们通过下面简单的例子来阐述menu的各个属性。

【转】Pro Android学习笔记(三十):Menu(1):了解Menupublic class OptionMenuTest extends Activity {
    private static int MENU_GROUP_1 = 1; 
    private static int MENU_GROUP_2 = 2; 
    private Menu optionMenu = null; 
    ... ...  
    @Override 
    // 一个Activity只关联一个menu,这使得处理比较简单,在onCreateOptionsMenu()中对menu进行具体的描述。返回true,确认menu为visible,否则menu不可视。
    // 在Android3.0之前的版本,onCreateOptionsMenu()是在用户第一次访问option menu才调用,书中说在Android 3.0后,为了适配平板,menu是UI的一部分。onCreateOptionsMenu()是在Activity创建阶段调用。但是在实际实验中,对于手机,Android 4.0,仍是在第一次访问option menu中调用,可能平板和手机有不同的处理方式。
    public boolean onCreateOptionsMenu(Menu menu) {      
        //menu.add(groupId, itemId, order, title); 通过add()增加menuItem,每个menuItem有groupId,itemId,Order。这三个属性是相互独立,没有关联。  
        menu.add(MENU_GROUP_1, 1, 1, "menuItem.1"); 
        menu.add(MENU_GROUP_1, 2, 2, "menuItem.2"); 
        menu.add(MENU_GROUP_2, 3, 3, "menuItem.3"); 
        menu.add(MENU_GROUP_2, 4, 4, "menuItem.4");  

        optionMenu = menu; //获取menu对象,用于之后的试验 
        //只有返回true,才能显示menu,即menu为visible。如果设置false,则menu为invisible。
        return true; 
    } 
}

MenuItem的属性:itemId

MenuItem有三个关键的属性,groupId,itemId和Order。这三个属性是相互独立的,没有关联的。也就是不是有groupId和itemId共同作为itemId的表示,而只是由itemId作为menuItem的唯一标识,不能存在冲突。一般我们分配的itemId的为1~0x0ffff,在非常足够的。一般在程序中,我们并不如上例直接赋予itemId准确的数值,通常使用Menu.FIRST作为偏移量基准,如:

menu.add(MENU_GROUP_1, Menu.FIRST, 1, "menuItem.1"); 
menu.add(MENU_GROUP_1, Menu.FIRST + 1, 2, "menuItem.2");
menu.add(MENU_GROUP_2, Menu.FIRST + 2, 3, "menuItem.3"); 
menu.add(MENU_GROUP_2, Menu.FIRST + 3, 4, "menuItem.4"); 

Menu.FRIST为1,但我们不确定未来android版本会不会对之进行更改,采用相对偏移量是最安全的做法。

Android系统对itemId有分类:

  • 0x10000(Menu.CATEGORY_CONTAINER)及之后的用于容器。例如layout就是一个容器。
  • 0x20000(Menu.CATEGORY_SYSTEM)及之后的用于System,是系统预留的。Windows Phone平台有系统菜单项,如Close,Refresh;目前android系统并没有系统预留菜单项的定义,但有可能在未来增加。
  • 0x30000(Menu.CATEGORY_SECONDARY)及之后的用于Sencondary,即相对不那么重要的。
  • 0x40000(Menu.CATEGORY_ALTERNATIVE)及之后的用于alternative,由外部应用提供的替代方式。

MenuItem的itemId的唯一性是很容易保证的。如果我们通过XML,在资源中定义menu,具体例子见Pro Android学习笔记(十):了解Intent(上)中“系统的Intent”,系统会自动在R.java中分配唯一的id号。

MenuItem的属性:groupId

若干个itemId可以享有同一个groupId,通过groupId,可以对他们进行统一的操作。如下:

optionMenu.setGroupCheckable(MENU_GROUP_2, true /*isCheckable*/, false); //第三个参数true为单选,false为多选
optionMenu.setGroupEnabled(MENU_GROUP_2, false/*isEnabled*/);
optionMenu.setGroupVisible(MENU_GROUP_2, false /*isVisible*/); 
optionMenu.removeGroup(MENU_GROUP_2);

MenuItem的属性:orderId

orderId决定item的排列顺序。在上面的例子中,如果我们将第三个item的orderId设置为6,如下:

menu.add(MENU_GROUP_2, 3, 6, "menuItem.3");

由于第四个item的orderId为4,小于第三个item的orderId,所以第四个item排在第三个之前。

MenuItem的属性:可选属性

groudId,itemId和orderId都是可选的属性,如果我们不需要进行区分,可以设置为Menu.NONE。

Menu触发

onOptionItemSelected

当用户点击menu item,将会触发onOptionItemSelected()回调函数,这是最常用的处理方式。

【转】Pro Android学习笔记(三十):Menu(1):了解Menupublic booleanonOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){  //通过itemId判断具体是那个菜单项被用户点击
    case 3: 
    case 4: 
        if(item.isCheckable()){   //如果我们设置了item为checkable,点击该菜单项,UI不会自动地显示选中,需要在代码中进行设置。
            boolean isChecked = item.isChecked(); 
            item.setChecked(!isChecked);  
        } 
        break; 
    default: 
        break; 
    }  
     
    // 菜单项点击,不仅提供onOptionsItemSelected()的一种触发方式,我们将在后面试验其他的两种方法,如果我们希望将菜单项点击的事件传递下去,继续触发其他处理,则返回false,如果我们认为全部已经处理完,到此为止,不需要将事件传递下去,则返回true。如果采用return super.onOptionsItemSelected(item); 则返回值为flase,即系统缺省返回false。
    return true;
 

Click Listener

menu item同样支持click listener,但是这种方式在性能上没有onOptionItemSelected()节省,所以一般情况,我们仍会使用onOptionItemSelected()。但是click listener的优先级别比onOptionItemSelected()高,也就是菜单项点击后,先触发click listener,如果返回flase(未处理完,继续传递事件),才会进一步触发onOptionItemSelected()。

和所有的监听器一样,代码分为两步,一是注册监听器,二是编写监听器的回调函数。例如如下:

public class OptionMenuTest extends Activity implements OnMenuItemClickListener{
    … … 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        … … 
        return true; 
    }  
      
   @Override 
    public boolean onOptionsItemSelected(MenuItem item) { // 优先级别低于onMenuItemClick() 
        ... ... 
        //【步骤1】注册监听器
        MenuItem item4 = menu.add(MENU_GROUP_2, 4, 4, "menuItem.4");
        item4.setOnMenuItemClickListener(this); 
         … … 
        return super.onOptionsItemSelected(item);
    } 
      
    @Override 
    //【步骤2】 实现监听器的回调函数,onMenuItemClickListener接口的onMenuItemClick()
    public boolean onMenuItemClick(MenuItem item) { 
        ……   
        return false; //如果返回true,chick事件将不往下传递,即不会触发onOptionsItemSelected();
    } 
  
}

使用Intent

将菜单项和intent关联,用户点击后,系统将自动执行startActivity(intent)。intent的优先级别低于onOptionItemSelected()。例在如下,当用户按菜单项1后,系统会打开browser,并打开指定的网页。

public boolean onCreateOptionsMenu(Menu menu) { 
    ... ... 
    MenuItem item1 = menu.add(MENU_GROUP_1, 1, 1, "menuItem.1");
   //关联intent,该intent会在执行完onOptionsItemSelected()后执行,当然onOptionsItemSelected()要返回false。
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setData(Uri.parse("http://blog.csdn.net/flowingflying")); 
    item1.setIntent(intent);      
    ... ... 
    return true; 

相关链接: 我的Android开发相关文章

本博文涉及的例子代码,可以在Pro Android学习:Menu中下载。

相关文章: