http://hi.baidu.com/xmjmcai/blog/item/f22a468b1400ae8fa4c272a9.html
http://hi.baidu.com/xmjmcai/blog/item/f22a468b1400ae8fa4c272a9.html
1. 菜单的种类
1) OptionsMenu 选择菜单
这是应用程序最常用的菜单。当按下Menu按钮时弹出的菜单。
2) ContextMenu 上下文菜单
当长按某个View时弹出的菜单。从理论上说和xp下的右击一致。
3) SubMenu 子菜单
与其它两种菜单合用实现多级菜单。
2. 如何使用菜单呢?
1) 通常通过使用xml配置来实现菜单,很少使用代码来实现菜单。使用xml的好处就是很容易看清menu的结构。xml需要保存在res/menu/目录下,这样就可被android编译成menu类。
android:id属性:当菜单项被选择时,用于识别。
2) 1)中定义的Menu,此时并不区分它是OptionsMenu还是ContextMenu,即都有可能。下面粗体字是填充Menu的代码。
3. 创建OptionsMenu
1) OptionsMenu通常是Activity最基本的动作。在Android2.3以及之前OptionsMenu显示如图,在Android3.0以及之后显示在Action Bar上,如图。
2) 由于Activity默认情况已经实现了OptionsMenu,只是此时Memu为空。我们需要做的就是在onCreateOptionsMenu(Menu menu)回调函数中填充Menu即可。
3) 当用户点击菜单,Activity会返回MenuItem,通过getItemId得到它的id,根据返回id对照xml的android:id属性进行后续的操作。直接贴代码了:
值得注意的是返回ture说明已处理,返回false则说明未处理,系统会将MenuItem传递给父类处理。
4) 继3),Android3.0提供了另一种处理方式。即在xml中的MenuItem中定义android:onClick属性,它的值对应Activity中的成员方法名。此时实现该成员方法就是对MenuItem点击的处理。
5) 如果在你的应用程序中多个Activity的OptionsMenu是一致的。为了提供可重用性,实现Activity的onCreateOptionsMenu和onOptionsItemSelected,然后实现Activity继承于该Activity。
当然上述的并不需要完全一致,只需将所有Activity的共同的MenuItem定义于父类即可。因为子类可以通过menu.add()添加新的MenuItem。由于每个Activity维护着自己的Menu,所以并不会对其他Activity的Menu造成影响。
6) Activity在onCreateOptionsMenu中创建Menu,这个函数只被调用一次。Android2.3以及之前是第一次使用OptionsMenu时调用。Android3.0以及之后是在创建Activity时调用。这样的话就意味着你无法修改Menu。
为了能够修改Menu,Android系统提供了onPrepareOptionsMenu函数,在该函数中你可以删除、添加、使能MenuItem。Android2.3以及之前在每次显示OptionsMenu都会调用onPrepareOptionsMenu。Android3.0以及之后需要调用invalidateOptionsMenu之后,才会调用该函数。
由于使用触摸屏是不会具有焦点focus。即当你使用触摸屏选择一个MenuItem时,该MenuItem并不会具有焦点。所以不要使用焦点的特性去修改Menu。如果你需要利用焦点的特性,可以选择ContextMenu。
4. 创建ContextMenu。
1) 和XP下的右击功能类似。它是基于View的菜单。由于它是基于View的,所以它可以解决触摸屏没有焦点的问题。ContextMenu适用所有View,但应用时通常是ListView。为了提示用户具有ContextMenu,ListView通常会使用背景变化做为提示。
2) 使用ContextMenu,首先需要指定哪个View需要使用ContextMenu。通过调用registerForContextMenu(View)告知Activity。
3) 同OptionsMenu实现onCreateContextMenu和onContextItemSelected
值得注意的是一个Activity中可以有多个View注册ContextMenu菜单,如何实现不同的ContextMenu呢?这也是onCreateContextMenu中View参数的作用。
还有AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();的使用是为了判断ListView的哪个项被右击到了。
4) 如何动态修改ContextMenu呢?官网没介绍。
5. 创建SubMenu
1) 在xml中的<menu>中嵌套<menu>即可。待考证:值得我关心的android的菜单似乎只支持二级菜单,即只能嵌套两层。
2) 当SubMenu中的MenuItem被点击时,并没有特殊的处理。因为系统将SubMenu视为Menu的一部分,所以处理方法同它所在的Menu一致,即OptionsMenu与ContextMenu。