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与组是独立的。
操作菜单组的方法:
- removeGroup(id) -- 参数为组id,删除改组的所有菜单项
- setGroupCheckable(id,checkable,exclusive) -- 在选中菜单项时在该菜单相中显示一个勾选标记。当应用到组中时,它将为该组中的所有菜单项启用此功能。如果设置了此方法的独占标志exclusive,那么只允许该组中的一个菜单项处于勾选状态。其他菜单项将保持位选中状态。
- setGroupEnabled(id,boolean enabled) -- 启用或禁用给定组中的菜单项
- setGroupVisible(id,visible) -- 控制改组菜单项是否可见
-
响应菜单项
- 通过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。
-
- 通过监听器响应菜单项
- 实现OnMenuClickListener接口。然后获取此实现的一个实例并将其传递给菜单项。当单击菜单项时,该菜单项将调用OnMenuClickListener接口的onMenuItemClick()方法。
-
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); }
- onMenuItemClick方法在调用菜单项时调用。这段代码会在单击菜单项时执行,即使这一操作发生在调用onOptionsItemSelected()方法之前也是如此。如果onMenuItemClick返回true,将不会执行其他任何回调,包括onOptionsItemSelected()回调方法。这意味着,监听器代码的优先级高于onOptionsItemSelected()方法。
- 使用Intent响应菜单项
- 使用MenuItem的setIntent(intent)方法,将菜单项与Intent关联。默认情况下,菜单项没有与之关联的Intent。但是当Intent与菜单项关联,并且没有其他方法处理菜单项时,默认的行为将石使用startActivity(intent)调用该Intent。为此,所有处理程序(尤其是onOptionItemSelected方法)应该为未被处理的菜单项调用父类的onOptionItemSelected()方法。或者可以这样理解:系统为onOptionItemSelected方法提供了首先处理菜单项的机会。这里假设没有与菜单项直接联系的监听器,如果有,监听器将覆盖剩余的菜单项。
- 如果没有重写onOptionsItemSelected()方法,那么Android框架中的基类将执行必要的操作,在菜单项上调用Inten。如果重写了此方法但对此菜单项不感兴趣,那么必须调用父方法,父方法然后会调用Intent。所以基本思路是这样的:要么补充写onOptionsItemSelected()方法,要么重写他并为未处理的菜单项调用父方法。
- 通过onOptionsItemSelected响应菜单项