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()方法,要么重写他并为未处理的菜单项调用父方法。

       

      

  

 

posted @ 2015-02-03 00:59  修车码农  阅读(519)  评论(0编辑  收藏  举报