android提供了三种菜单类型,分别为options menu,context menu,sub menu。options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。这两种menu都有可以加入子菜单,子菜单不能种不能嵌套子菜单。
options menu最多只能在屏幕最下面显示6个菜单选项,成为icon menu,icon menu不能有checkable选项。多余6的会以more icon menu来调出,成为expanded menu。options menu通过activity的onCreateOptionsMenu来生成,这个函数只会在menu第一次生成时调用。任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。onOptionsItemSelected 处理选中的菜单项。
context menu是跟某个具体的view绑定在一起,在activity种用registerForContextMenu来为某个view注册context menu。context menu在显示前都会调用onCreateContextMenu来生成menu。onContextItemSelected选中的菜单项。
android还提供了对菜单项进行分组的功能,可以把相似功能的菜单项分成同一个组,这样就可以通过调用setGroupCheckable,setGroupEnabled,setGroupVisible来设置菜单属性,而无须单独设置。
1、利用xml定义选项菜单
a) options menu通过activity的onCreateOptionsMenu来生成
b) 这个函数只会在menu第一次生成时调用。
i. 任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。
c) onOptionsItemSelected 用来处理选中的菜单项。
1、 响应菜单项单击事件
3种方式
onMenuItemSelected(int featureId, MenuItem item)
public boolean onOptionsItemSelected (MenuItem item)
onMenuItemClick
2、 动态添加、修改和删除菜单项
菜单项的增删改查
增:add, addSubMenu
删:removeItem,removeGroup
改:
l 选项菜单:onPrepareOptionsMenu()——> MenuItem->setXXX()
l 上下文菜单:onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {} 方法在每次调用上下文菜单时都会被调用一次
boolean cn.class3g.activity.MenuTestActivity.onPrepareOptionsMenu(Menu menu) public boolean onPrepareOptionsMenu (Menu menu) Prepare the Screen's standard options menu to be displayed. This is called right before the menu is shown, every time it is shown. You can use this method to efficiently enable/disable items or otherwise dynamically modify the contents. The default implementation updates the system menu items based on the activity's state. Deriving classes should always call through to the base class implementation. Parameters
Returns · You must return true for the menu to be displayed; if you return false it will not be shown. See Also |
private int i = 0; public boolean onPrepareOptionsMenu(Menu menu) { i++; MenuItem mi = menu.getItem(0); mi.setTitle(mi.getTitle() +""+ i); return super.onPrepareOptionsMenu(menu); } |
3、 子菜单的创建
l Xml创建
l 动态创建
Menu submenu = Menu.addSubMenu(x, x, x, x)
submenu.add()
submenu.add()
main_menu.addSubMenu(x,x,x,x);
或:
getMenuInflater ().inflater(R.menu.submenu, submenu);
4、 带单选或复选的子菜单
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.second_menu, menu); SubMenu sb = menu.findItem(R.id.item3).getSubMenu(); sb.setIcon(R.drawable.ic_launcher); // sb.setGroupCheckable(0, true, true); sb.getItem(0).setCheckable(true); sb.getItem(0).setChecked(true); this.menu = menu; return super.onCreateOptionsMenu(menu); } |
5、 上下文子菜单
public class ContextMenuActivity extends Activity { ContextMenu menu = null; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) this.findViewById(R.id.textView); this.registerForContextMenu(tv); } public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo){ menu.setHeaderTitle("上下文菜单"); menu.setHeaderIcon(R.drawable.ic_launcher); getMenuInflater().inflate(R.menu.context_menu, menu); this.menu = menu; } public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.subitem1: Toast.makeText(this, "subitem1", Toast.LENGTH_SHORT).show(); break; case R.id.subitem2: Toast.makeText(this, "subitem2", Toast.LENGTH_SHORT).show(); break; case R.id.subitem3: Toast.makeText(this, "subitem3", Toast.LENGTH_SHORT).show(); break; } return true; } } |
1.选项菜单
选项菜单上的多个指令(指令,即功能指令,译者注)是全局适用的,且可并行作用于当前进程 (原文为Activity,类似PC上的进程,下同.译者注),也可启动另一个进程.却不适用(文本)内容里的被选中中项.
(程序员就容易理解这段,大意是选项菜单可针对运行中的程序启动某些功能)
在大部分的手机上,用户按下”MENU”键就会在屏幕下方显示选项菜单.而用户再次按下”MENU”键或”返回”键就会关闭选项菜单.实际上,想要关闭任何菜单都可统一使用”返回”键.(重复按下”MENU”键或者点击屏幕空白处也能实现同样效果.) 并需要注意在不同手机上的操作方法.
每个进程有属于它们的操作方式和选项菜单.一个程序的多个进程会有不同的选项菜单.
比如,在 Email程序的邮件列表里面,选项菜单有邮件搜索,邮件排序,刷新列表,和更改邮箱设置等的功能.在Email程序的撰写模式下,选项菜单也有差异之处,例如多出了复制副本,添加附件和删除邮件这几个功能.
为了处理数目众多的菜单项,选项菜单通常以两步来逐级呈现.
• 图标选项菜单 –初次按下MENU键,屏幕底部会显示几个带图标且不可滚动的网格.(G1手机上会显示6个典型按钮.)
• 扩展选项菜单 –如果这个进程的菜单项很多(超过6个),选项菜单的最后一个图标会标记”更多”–选中后会弹出一个包含多个菜单项目的列表,此列表有时还可以滚动.
2.关联菜单
关联菜单类似于桌面操作系统(如Win7,译者注)的右键菜单.这便于在任何地方都能启动一些指令.
如下图所示,用户可以长按屏幕上的内容来打开关联菜单 (若有的话).关联菜单其实是被选中内容的一些可操作指令的列表.指令也可以成为当前进程的一部分,系统也能通过被选中内容去启动另一个进程进行操作.
例如,在邮件列表中,用户长按邮件信息会弹出一个含有阅读,归档,删除等指令的关联菜单 .
用户亦可长按屏幕某些位置来打开关联菜单.比如当用户准确地在主屏幕界面(Home screen)空白处长按,同样会显示一个关联菜单。