首页 > 代码库 > Android-Menu菜单使用一

Android-Menu菜单使用一

  • 创建菜单

   在AndroidSDK中,无需从头创建菜单对象。因为一个活动只与一个菜单关联,所以Android会为该活动创建此菜单,然后将它传给Activity类的onCreateOptionsMenu回调。此方法可用于使用一组菜单项填充单个传入的菜单。

@Override    public boolean onCreateOptionsMenu(Menu menu) {        //....        return super.onCreateOptionsMenu(menu);    }

  当填充菜单项之后,这段代码返回true,使菜单可见。如果返回false,菜单将不可见。

@Override    public boolean onCreateOptionsMenu(Menu menu) {        menu.add(0,     //菜单组                1,         //菜单项id                0,         //菜单项排序id                "option1");        //菜单项标题        menu.add(0, 2, 1, "option2");        menu.add(0, 3, 2, "option3");        return super.onCreateOptionsMenu(menu);    }

  添加菜单项所必需的第一个参数是菜单组id(int型)。第二个参数是菜单项id,在选择该菜单项时会将它发送给回调函数。第三个参数表示排序id。最后一个参数是菜单项的标题(即显示的菜单项名称)。

  除了title参数以外的三个参数:菜单组,菜单项id,菜单项排序id都是可选的,如果不想指定任何id,可以使用Menu.NONE。

  • 使用菜单组

@Override    public boolean onCreateOptionsMenu(Menu menu) {        int group1 = 1;        menu.add(group1, 1, 1, "g1.item1");        menu.add(group1, 2, 2, "g1.item2");        int group2 = 2;        menu.add(group2, 3, 3, "g2.item1");        menu.add(group2, 4, 4, "g2.item2");        return super.onCreateOptionsMenu(menu);    }

这里需要注意,菜单项id和排序id与组是独立的。

操作菜单组的方法:

  1. removeGroup(id)   -- 参数为组id,删除改组的所有菜单项
  2. setGroupCheckable(id,checkable,exclusive)  -- 在选中菜单项时在该菜单相中显示一个勾选标记。当应用到组中时,它将为该组中的所有菜单项启用此功能。如果设置了此方法的独占标志exclusive,那么只允许该组中的一个菜单项处于勾选状态。其他菜单项将保持位选中状态。
  3. setGroupEnabled(id,boolean enabled)  -- 启用或禁用给定组中的菜单项
  4. setGroupVisible(id,visible)  -- 控制改组菜单项是否可见
  • 响应菜单项

    1. 通过onOptionsItemSelected响应菜单项
      • @Override    public boolean onOptionsItemSelected(MenuItem item) {        // TODO Auto-generated method stub        switch (item.getItemId()) {        case 1:            Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();            break;        case 2:            Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();            break;        case 3:            Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();            break;        case 4:            Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();            break;        }        return super.onOptionsItemSelected(item);    }

        这里的关键模式是通过MenuItem类的getItemId()方法检查菜单项id,然后执行必要的操作。如果onOptionsItemSelected()处理了一个菜单项,它将返回true。此菜单事件将不会进一步传播。对于onOptionsItemSelected()未处理的菜单项回调,onOptionsItemSelected()应该通过super.onOptionsItemSelected()调用父方法。onOptionsItemSelected()的默认实现返回false。

    2. 通过监听器响应菜单项
      1. 实现OnMenuClickListener接口。然后获取此实现的一个实例并将其传递给菜单项。当单击菜单项时,该菜单项将调用OnMenuClickListener接口的onMenuItemClick()方法。
      2. class MyResponse implements OnMenuItemClickListener{        @Override        public boolean onMenuItemClick(MenuItem item) {            switch (item.getItemId()) {            case 1:                Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();                break;            case 2:                Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();                break;            case 3:                Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();                break;            case 4:                Toast.makeText(MainActivity.this, item.getTitle(), 1000).show();                break;            }            return true;        }    }
            @Override    public boolean onCreateOptionsMenu(Menu menu) {                int group1 = 1;        menu.add(group1, 1, 1, "g1.item1");        menu.add(group1, 2, 2, "g1.item2");        int group2 = 2;        menu.add(group2, 3, 3, "g2.item1");        menu.add(group2, 4, 4, "g2.item2");                for (int i = 1; i < menu.size(); i++) {            menu.getItem(i).setOnMenuItemClickListener(new MyResponse());        }        return super.onCreateOptionsMenu(menu);    }
      3.   onMenuItemClick方法在调用菜单项时调用。这段代码会在单击菜单项时执行,即使这一操作发生在调用onOptionsItemSelected()方法之前也是如此。如果onMenuItemClick返回true,将不会执行其他任何回调,包括onOptionsItemSelected()回调方法。这意味着,监听器代码的优先级高于onOptionsItemSelected()方法。
    3. 使用Intent响应菜单项
      1. 使用MenuItem的setIntent(intent)方法,将菜单项与Intent关联。默认情况下,菜单项没有与之关联的Intent。但是当Intent与菜单项关联,并且没有其他方法处理菜单项时,默认的行为将石使用startActivity(intent)调用该Intent。为此,所有处理程序(尤其是onOptionItemSelected方法)应该为未被处理的菜单项调用父类的onOptionItemSelected()方法。或者可以这样理解:系统为onOptionItemSelected方法提供了首先处理菜单项的机会。这里假设没有与菜单项直接联系的监听器,如果有,监听器将覆盖剩余的菜单项。
      2. 如果没有重写onOptionsItemSelected()方法,那么Android框架中的基类将执行必要的操作,在菜单项上调用Inten。如果重写了此方法但对此菜单项不感兴趣,那么必须调用父方法,父方法然后会调用Intent。所以基本思路是这样的:要么补充写onOptionsItemSelected()方法,要么重写他并为未处理的菜单项调用父方法。

       

      

  

 

Android-Menu菜单使用一