android2.2资源文件详解4--menu文件夹下的菜单定义
四.menu下定义菜单
格式:<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@[+][package:]id/resource_name" android:title="string" android:titleCondensed="string" android:icon="@[package:]drawable/drawable_resource_name" android:onClick="method name" android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"] android:actionLayout="@[package:]layout/layout_resource_name" android:actionViewClass="class name" android:actionProviderClass="class name" android:alphabeticShortcut="string" android:numericShortcut="string" android:checkable=["true" | "false"] android:visible=["true" | "false"] android:enabled=["true" | "false"] android:menuCategory=["container" | "system" | "secondary" | "alternative"] android:orderInCategory="integer" /> <group android:id="@[+][package:]id/resource name" android:checkableBehavior=["none" | "all" | "single"] android:visible=["true" | "false"] android:enabled=["true" | "false"] android:menuCategory=["container" | "system" | "secondary" | "alternative"] android:orderInCategory="integer" > <item /> </group> <item > <menu> <item /> </menu> </item> </menu>
属性:menu:根属性,包含item和group
item:必须是menu或者group的子元素,可以包含menu(子菜单)
group:必须是menu的子元素,包含item
属性详解:
menu:xmlns:android="http://schemas.android.com/apk/res/android"
item:
<item android:id="@+id/item1" android:alphabeticShortcut="m" android:checkable=""是否能被选中 android:checked=""是否是默认选中的 android:enabled=""是否可用 android:icon=""图标 android:menuCategory="container"菜单分类 android:numericShortcut=""数字快捷键 android:orderInCategory=""在分类中顺序 android:title="root(m)"标题 android:titleCondensed="mm"简化标题 android:visible=""/>是否可见
说明:其中menuCategory分为:
container
For groups that are part of a container.
system
For groups that are provided by the system.
secondary
For groups that are user-supplied secondary (infrequently used) options.
alternative
For groups that are alternative actions on the data that is currently displayed.
group:android:checkableBehavior子类项的选择方式
none
Not checkable
all
All items can be checked (use checkboxes)
single
Only one item can be checked (use radio buttons
详解介绍:
1.选项菜单(option menu),当用户按下menu键或者调用openOptionsMenu()打开,第一次打开会依次回调:public boolean onCreateOptionsMenu(Menu menu)和public boolean onPrepareOptionsMenu(Menu menu
,以后每次打开只会回调: public boolean onPrepareOptionsMenu(Menu menu).返回键或者调用public void closeOptionsMenu()会关闭menu.会回调事件:public void onOptionsMenuClosed(Menu menu)
所以一般在onCreateOptionsMenu(Menu menu)中初始化:
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //通过MenuInflater将XML 实例化为 Menu Object MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }
boolean onPrepareOptionsMenu(Menu menu)·这个方法将已经创建的 Menu 实例作为参数传递,这样的话就可以移除、添加、修改菜单项。
·Android 2.3及其之前的版本,系统在用户每次打开Options Men 时会调用onPrepareOptionsMenu()方法。
·Android 3.0及其之后的版本,当你要更新菜单时你必须调用 invalidateOptionsMenu() 方法,因为菜单
是一直打开着的,然后系统会自动调用 onPrepareOptionsMenu() 方法。
事件处理:public boolean onOptionsItemSelected(MenuItem item)
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.about: // 显示关于页 displayAboutBox(); return true; case R.id.help: // 显示到帮帐页 displayHelpDialog(); return true; case R.id.settings: // 跳转到配置页 displaySettings(); return true; case R.id.quit: // 退出程序 finish(); return true; default: //返回False交由系统正常处理菜单,返回True则由本程序处理 return false; } }
2.上下文菜单(content menu):长时间按住view会产生,需要在某个view上注册
说明:长时间按住就会调用oncreatecontextMenu,但是也可以调用public void openContextMenu(View view)打开,关闭时可以调用:closeContextMenu()
定义的xml格式和选项菜单是一样的,初始化调用public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater=getMenuInflater(); inflater.inflate(R.menu.meetings_context_menu, menu); }
事件处理:onContextItemSelected
@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.delete_meeting: postionOfMeetingToDelete = info.position; showDialog(CONFIRM_DELETE_MEETING_DIALOG); return true; default: return super.onContextItemSelected(item); } }
注册菜单:registerForContextMenu和解除注册 unregisterForContextMenu
关闭时所回调的事件:onContextMenuClosed
注意:ContextMenu 与 OptionsMenu 的菜单资源XML文件格式完全相同,不能显示icon,但是ContextMenu可以具有自己的标题栏;
·通过setHeaderIcon、setHeaderTitle、setHeaderView、clearHeader方法控制标题栏的显示。
·ContextMenu 继承自 Menu ,标题栏相关的方式是扩展的方法。
多个 View 可以同时注册同一个 ContextMenu
有些 View 会自带系统的 ContextMenu,比如 EditText 会自带“输入法”“复制”“粘贴”等菜单项,
再对这些 View 注册 ContextMenu 时,会将系统菜单项和自己注册的菜单项融合到一起
3.sub menu(子菜单):在定义选项菜单和上下文菜单时可以加入子菜单,当子菜单被选中时 仍然调用和父类菜单选中时一样的方法.
可以动态的通过addsubmenu和add方法添加子菜单和子菜单项
子菜单有相应的标题栏和相应的方法
其余的特性:
菜单组:可以通过menu.setGroupCheckable();
menu.setGroupEnabled();
menu.setGroupVisible()
进行同意设置
可以通过group的android:checkableBehavior属性设置组菜单项的选择模式
single
Only one item from the group can be checked (radio buttons)all
All items can be checked (checkboxes)none
No items are checkable但是选择后我们要手动的改变状态,使用方法:setChecked()