本章要介绍的应用控制的最后两个方面:菜单栏和活动栏(Action Bar)。例6-15说明了如何通过覆盖两个Activity方法实现简单的菜单栏。
例6-15:实现菜单栏
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater.inflate(R.menu.simple_menu, menu); return true;}@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId) { case R.id.menu_clear: dotModel.clearDots; return true; default: ; return super.onOptionsItemSelected(item); }}
当把这段代码添加到TouchMe类时,单击设备的Menu按键,应用会弹出一个菜单,如图6-7所示。
单击Enter按键,或者再次单击菜单项,都会清除该DotView。
在Android蜂巢(Android 3.0)系统中,Google废弃了菜单按钮,而选择Action选项卡,在第9章将详细描述。但是,前面给出的代码是可以向前兼容的。
Google希望开发者能够完全抛弃菜单的概念,鼓励开发者创建可以直接操作对象的用户界面。Action选项卡提供一致的接口,可处理适用于不同屏幕尺寸的全局行为。
图6-7:一个简单的菜单
当Dots应用更新成目标Ice Cream Sandwich应用(在应用的manifest文件中,targetSdk Version=“14”)时,而且在蜂巢版本之后的Android系统中运行,同样的代码会在活动栏中生成action按钮。
该按钮即图6-8中显示的最右上方的垃圾回收站图标,是该应用的“Clear”action按钮。在之前的Android版本中,按下“Clear”按钮会清空显示的DotView。
有趣的是,如果你在蜂巢之前的Android版本上运行该应用,你会发现虽然添加的菜单项在绝大多数情况下能够正常运行,但是当光标定位在DotView时就不可用。你能猜到原因吗?
如果你猜到是因为DotView中安装了OnKeyListener,那么恭喜你,猜对了!在例6-16中,当单击菜单键后,监听器会直接返回true,而不会执行菜单键事件。这种方式拦截了对标准的菜单键按键View的处理。为了使菜单键可以正常工作,需要重新实现OnKeyListener。
图6-8:action按钮
例6-16:改进后的按键处理
switch (keyCode) { case KeyEvent.KEYCODE_MENU: return false; // ...
Android UI框架还支持上下文菜单,可以通过Context Menu类实现该功能。当长按支持该功能的widget按键时,会显示该菜单。添加上下文菜单到应用中的代码和前面给出的显示选项菜单的代码几乎是完全一样的,只是方法名不同而已,分别是onCreateContextMenu和onContextItemSelected。此外,添加上下文菜单到应用中还需要执行一个调用。要支持上下文菜单,必须在View类上调用setOnCreateContextMenuListener方法,为Widget分配View.OnCreateContextMenuListener接口。幸运的是,Activity类实现了View.OnCreateContextMenuListener接口。setOnCreateContextMenuListener方法的常见的调用方式如例6-17所示。
例6-17:安装ContextMenuListener
findViewById(R.id.ctxtMenuView).setOnCreateContextMenuListener(this);
只需要重载上下文菜单监听器提供的默认的、空Activity实现就可以为应用生成上下文菜单。