android中包含多种菜单,本例带来的是选项菜单和上下文菜单。
1.选项菜单
在android中,开发者可以在xml文档中部署所要添加的菜单,在后台调用即可。
1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id="@+id/action_add" 5 android:title="添加" 6 android:showAsAction="always|withText"/> 7 <item 8 android:id="@+id/action_save" 9 android:title="保存" 10 android:showAsAction="ifRoom"/> 11 <item 12 android:id="@+id/action_discard" 13 android:title="删除" 14 android:showAsAction="ifRoom"/> 15 <item 16 android:id="@+id/action_delete" 17 android:title="删除" 18 android:showAsAction="ifRoom"/> 19 <item 20 android:id="@+id/action_undo" 21 android:title="撤销" 22 android:showAsAction="ifRoom"/> 23 </menu>
在xml中我们定义了几个常用的菜单,添加、删除、保存等。在xml中定义菜单式通过在<menu/>中定义的。<item/>即为菜单项。android最多可以有六个菜单,超出之后android系统会自动将超出的菜单放在更多的菜单项。
1 public boolean onCreateOptionsMenu(Menu menu) { 2 Inflate the menu; this adds items to the action bar if it is present. 3 MenuInflater inflater = getMenuInflater(); 4 inflater.inflate(R.menu.main, menu); 5 mOptionsMenu = menu; 6 7 return super.onCreateOptionsMenu(menu); 8 }
重写onCreateOptionsMenu方法,这里调用已经定义好的menu.xml,可以显示我们刚刚定义的菜单项。
在开发中,菜单也是与事件分不开的。通过onoptionsitemclick,来监听菜单的选中事件。
1 public boolean onOptionsItemSelected(MenuItem menu) 2 { 3 4 switch(menu.getItemId()) 5 { 6 case R.id.action_add: 7 Toast.makeText(this, "您点击了添加", Toast.LENGTH_LONG).show(); 8 return true; 9 case R.id.action_delete: 10 Toast.makeText(this, "您点击了删除", Toast.LENGTH_LONG).show(); 11 return true; 12 case R.id.action_save: 13 Toast.makeText(this, "您点击了保存", Toast.LENGTH_LONG).show(); 14 return true; 15 case R.id.action_undo: 16 Toast.makeText(this, "你点击了撤销", Toast.LENGTH_LONG).show(); 17 return true; 18 default: 19 return super.onOptionsItemSelected(menu); 20 } 21 22 23 24 }
当然,开发人员也可以动态的添加菜单,不需要在xml中预先写好每一个菜单项。
mOptionsMenu.add(1, 1, 1, "添加");第一个参数:菜单项的分组id;第二个参数:菜单项的id;第三个参数:菜单显示顺序的id,android会根据id进行从左到右,从上到下的排序;第四个参数:菜单项的标题
2.子菜单和上下文菜单
在android中,子菜单和菜单是同一级的,可以通过submenu.add添加子菜单。添加一个带复选框的子菜单
1 public boolean onCreateOptionsMenu(Menu menu) { 2 // Inflate the menu; this adds items to the action bar if it is present. 3 // MenuInflater inflater = getMenuInflater(); 4 //inflater.inflate(R.menu.main, menu); 5 // mOptionsMenu = menu; 6 SubMenu filesubmenu=menu.addSubMenu(1,1,2,"文件"); 7 MenuItem newMenu=filesubmenu.add(1,2,2,"新建"); 8 newMenu.setCheckable(true); 9 MenuItem openMenu=filesubmenu.add(2,3,3,"打开"); 10 filesubmenu.setGroupCheckable(2, true, true); 11 return super.onCreateOptionsMenu(menu); 12 }
上下文菜单可以和任意的view关联,而且它必须关联一个view,例如button、textview等。
1 public void onCreateContextMenu(ContextMenu menu,View view,ContextMenuInfo menuInof) 2 3 { 4 super.onCreateContextMenu(menu, view, menuInof); 5 menu.add("上下文菜单"); 6 menu.add(0,ITEM1,Menu.NONE,"放大").setCheckable(true).setChecked(true); 7 menu.add(20,ITEM2,Menu.NONE,"缩小"); 8 menu.add(20,ITEM3,Menu.NONE,"平移"); 9 menu.setGroupCheckable(20, true, true); 10 SubMenu sub=menu.addSubMenu(0,4,Menu.NONE,"子菜单"); 11 sub.add("子菜单1"); 12 sub.add("子菜单2"); 13 }
上下文菜单中可以添加子菜单的。上下文菜单在添加中,需要注册。
Button button9=(Button)findViewById(R.id.button9);
registerForContextMenu(button9);
这里将定义的上下文菜单注册到button9中。
如果想实现对上下文菜单选择时间的监听,oncontextitemselected方法实现。
1 public boolean onContextItemSelected(MenuItem item){ 2 switch(item.getItemId()){ 3 case ITEM1: 4 //在这里添加处理代码 5 Toast.makeText(this, "点击了放大", 5000).show(); 6 return true; 7 case ITEM2: 8 //在这里添加处理代码 9 Toast.makeText(this, "点击了缩小", 5000).show(); 10 break; 11 case ITEM3: 12 //在这里添加处理代码 13 14 break; 15 } 16 return true; 17 }