Android系统里存在三种菜单,分别是options menu,context menu,sub menu,下面分别做介绍:
1. options menu + sub menu
点击android手机上的menu按键时显示,options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件。菜单项多于6个会以“more” icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样。在Activity里面,一般通过以下函数来使用options menu:
Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用。
Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用。
Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。
java代码:
public class MainActivity extends Activity {
ActionBar actionBar;
TextView menuTitle;
private static final int MENU_ITEM1 = Menu.FIRST;
private static final int MENU_ITEM2 = Menu.FIRST+1;
private static final int MENU_ITEM3 = Menu.FIRST+2;
private static final int MENU_ITEM4 = Menu.FIRST+3;
private static final int MENU_ITEM5 = Menu.FIRST+4;
private static final int MENU_ITEM6 = Menu.FIRST+5;
private static final int MENU_ITEM7 = Menu.FIRST+6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
menuTitle = (TextView)findViewById(R.id.menu_title);
actionBar = getActionBar();
actionBar.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 以xml文件的形式加载menu菜单
// getMenuInflater().inflate(R.menu.main, menu);
/*menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)
groupId:组别,如果不分组的话就写Menu.NONE
itemId:菜单项Id,这个很重要,Android根据这个Id来确定不同的菜单
order:顺序,哪个菜单项在前面由这个参数的大小决定
title:文本,菜单项的显示文本*/
MenuItem item1 = menu.add(0, MENU_ITEM1, MENU_ITEM1, R.string.item1);
MenuItem item2 = menu.add(0, MENU_ITEM2, MENU_ITEM2, R.string.item2);
MenuItem item3 = menu.add(0, MENU_ITEM3, MENU_ITEM3, R.string.item3);
menu.add(0, MENU_ITEM4, MENU_ITEM4, R.string.item4);
menu.add(0, MENU_ITEM5, MENU_ITEM5, R.string.item5);
menu.add(0, MENU_ITEM6, MENU_ITEM6, R.string.item6).setIcon((R.drawable.ic_launcher));
SubMenu subMenu = menu.addSubMenu(0,0,Menu.NONE,"SubMenu");
subMenu.setHeaderIcon(R.drawable.ic_launcher);
subMenu.setIcon(R.drawable.ic_launcher);
//为子菜单添加一个菜单项
subMenu.add(0,0,Menu.NONE,"Submenu Item");
//ActionBar如果有多余空间,菜单项会显示在ActionBar中
item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
item2.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem arg0) {
menuTitle.setText("点击了" + arg0.getTitle());
return false;
}
});
//当单击一个事件菜单后,该事件既没有被MenuItemClickListener处理,也没有被OptionsItemSelected处理,就会触发分配给这个菜单项的Intent.
item3.setIntent(new Intent(this,MainActivity.class));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ITEM3:
Toast.makeText(getApplicationContext(),
"MENU_ITEM3", Toast.LENGTH_SHORT).show();
break;
case MENU_ITEM4:
Toast.makeText(getApplicationContext(),
"MENU_ITEM4", Toast.LENGTH_SHORT).show();
break;
default:break;
}
return false;
}
<span style="white-space:pre"> </span>//每次显示菜单的时候会调用onPrepareOptionsMenu,根据程序的运行状态,可以对菜单进行动态的更改,可以动态地启用/禁用每一个菜单项
@Override
public boolean onPrepareOptionsMenu(Menu menu){
super.onPrepareOptionsMenu(menu);
return true;
}
}
若要在XML文件中编写menu文件,则在Activity::onCreateOptionsMenu (Menu menu)通过getMenuInflater().inflate(R.menu.main,
menu)进行加载。
menu的xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item1"
android:orderInCategory="1"
android:title="@string/item1"
android:showAsAction="ifRoom"
/>
<item
android:id="@+id/item2"
android:orderInCategory="2"
android:title="@string/item2"/>
<!-- 表示的是二级菜单 -->
<item
android:id="@+id/sub_menu"
android:orderInCategory="0"
android:title="@string/sub_menu">
<menu>
<item
android:id="@+id/sub_menu1"
android:alphabeticShortcut="n"
android:title="@string/sub_menu1"
android:visible="true"/>
<item
android:id="@+id/sub_menu2"
android:alphabeticShortcut="g"
android:title="@string/sub_menu2"
android:visible="true"/>
</menu>
</item>
</menu>
2. context menu + sub menu
context menu与相应的view绑定在一起,不支持快捷键和icon图标,在Activity里面,一般通过以下函数来使用context menu:
Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。
Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context menu每次显示时都会调用这个函数。
Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。
为view注册context menu的java代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
......
//为一个View注册一个上下文菜单
registerForContextMenu(menuEdit);
registerForContextMenu(menuTitle);
}
context menu被创建的java代码:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(GROUP_NUM1, CONTEXT_MENU_ITEM1, Menu.NONE, "checkbox1-group1").setCheckable(true).setChecked(true);
menu.add(GROUP_NUM1, CONTEXT_MENU_ITEM2, Menu.NONE, "checkbox2-group1").setCheckable(true).setChecked(false);
menu.add(GROUP_NUM2, CONTEXT_MENU_ITEM1, Menu.NONE, "radiobox1-group2").setChecked(true);
menu.add(GROUP_NUM2, CONTEXT_MENU_ITEM1, Menu.NONE, "radiobox2-group2").setChecked(false);
//函数原型setGroupCheckable(int group, boolean checkable,boolean exclusive)
menu.setGroupCheckable(GROUP_NUM2, true, true);// 这句话要写在groupitem的最后。
}
若要在XML文件中编写context menu文件,则在Activity::onCreateOptionsMenu
(Menu menu)通过getMenuInflater().inflate(R.menu.main, menu)进行加载。
效果截图(手指触及view两秒左右context menu弹出):