1.概念java
<1>Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫作选项菜单(Option Menu)。android
<2>从3.0开始,Android不要求手机设备上必须提供MENU按键。所以Android推荐使用ActionBar来代替Menu。ide
二、分类布局
<1>OptionsMenu 按手机menu弹出的菜单ui
(1)重写public boolean onCreateOptionsMenu(menu)方法this
// 显示弹出菜单布局必需要重写的方法,在这个地方加载菜单文件 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); setIconEnable(menu, true); // 必需要返回true return true; }
(2)建立菜单项MenuItemcode
a.建立菜单XML文件,必须以<menu>为根标签xml
菜单XML的位置:/res/menu/对象
<item>标签属性继承
android:id表示item的id
android:icon表示菜单的图标,4.0系统仅在ActionBar上显示图标
android:title表示菜单的文字
二级子菜单
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:title="@string/file" > <!-- "file" 的子菜单 --> <menu> <item android:id="@+id/create_new" android:title="@string/create_new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>
二级组菜单
<item android:id="@+id/menu_group2" android:orderInCategory="1" android:showAsAction="never" android:title="文字颜色"> <menu > <group> <item android:id="@+id/font_red" android:title="red" /> <item android:id="@+id/font_green" android:title="green"></item> <item android:id="@+id/font_blue" android:title="blue"></item> <item android:id="@+id/font_yellow" android:title="yellow"></item> </group> </menu> </item>
二级可选组菜单
<item android:id="@+id/menu_group1" android:orderInCategory="1" android:showAsAction="never" android:title="文字尺寸"> <menu > <!-- android:checkableBehavior 属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单 --> <group android:checkableBehavior="single"> <item android:id="@+id/font_10" android:title="10sp"></item> <item android:id="@+id/font_15" android:title="15sp"></item> <item android:id="@+id/font_20" android:title="20sp"></item> <item android:id="@+id/font_25" android:title="25sp"></item> <item android:id="@+id/font_30" android:title="30sp"></item> </group> </menu> </item>
经过MenuInflater.inflater(int menuId,menu)方法将菜单项追加到菜单中
b.menu.add()方法增长菜单
menu.add()方法返回MenuItem对象
setIcon (int iconRes)
setTitle (CharSequence title)
setOnMenuItemClickListener(OnMenuItemClickListener)
setIntent(Intent)设置点击菜单项时打开的窗口
menu.add(CharSequence) :通常使用方法,增长菜单名称
menu.add(0, 1, 1, "拍照")
第一个参数为GroupID,Group即将菜单项分组
第二个参数为ItemID,指的是菜单项的id
第三个参数为order,指定菜单项的位置顺序
第四个参数为title,指的是菜单项所显示的文字
(3)重写public boolean onOptionsItemSelected(MenuItem item)方法,实现菜单项的选择事件
// 要作弹出菜单的点击事件必须重写的方法 @Override public boolean onOptionsItemSelected(MenuItem item) { // 获取被点击的菜单的id int id = item.getItemId(); switch (id) { case R.id.item2: Toast.makeText(this, "清除"+item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.item3: Toast.makeText(this, "杀毒"+item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.item4: Toast.makeText(this, "拨号"+item.getTitle(), Toast.LENGTH_SHORT).show(); break; default: break; } return super.onOptionsItemSelected(item); }
<2>ContextMenu 长按绑定UI控件的上下文菜单(上下文菜单继承自android.view.Menu)
(1)上下文菜单与Options Menu最大的不一样在于:
Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;
每一个Activity最多只有一个Options Menu,它为整个Activity服务。而一个Activity每每有多个View,哪一个View须要上下文菜单就经过registerForContextMenu(View view)给这个View注册上下文菜单。
(2)生成上下文菜单是经过Activity中的onCreateContextMenu()方法:
onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;
二者的不一样在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。
(3)ContextMenuInfo 有什么用呢?
当视图元素须要向上下文菜单传递一些信息,好比该View对应DB记录的id等,这就要使用ContextMenuInfo。须要传递额外信息的View须要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。通常用在AdaterViews(例如:Spinner 、ListView或GridView)上,能够在ContextMenuInfo 中获取到适配器View中的position的信息。
(4)开发上下文菜单的步骤:
重写onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;
调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
建立菜单xml文件,必须以<menu>为根标签
menu.setHeaderTitle(String) 设置窗口头的标题
menu.setHeaderIcon(R.drawable.face) 设置窗口头的图标
为菜单项提供响应,重写onContextItemSelected(MenuItem item)。
Activity.registerForContextMenu(须要显示ContextMenu的控件)
<3>PopupMenu 在指定UI控件的下方或上方显示的弹出菜单
(1)PopupMenu(Context context, View anchor): 第二个参数是指弹出菜单显示的哪个控件的下方或上方
(2)MenuInflater.inflate(int menuResId,PopupMenu.getMenu()) 加载菜单资源到弹出菜单对象中
(3)setOnMenuItemClickListener() 设置弹出菜单项的点击事件
(4)show() 弹出菜单
(5)dismiss() 关闭菜单
<4>解决菜单项不显示图标的问题
//enable为true时,菜单添加图标有效,enable为false时无效。 private void setIconEnable(Menu menu, boolean enable) { try { Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder"); Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class); m.setAccessible(true); //MenuBuilder实现Menu接口,建立菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征) m.invoke(menu, enable); } catch (Exception e) { e.printStackTrace(); } }