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分为:

containerFor groups that are part of a container.

systemFor groups that are provided by the system.

secondaryFor groups that are user-supplied secondary (infrequently used) options.

alternativeFor groups that are alternative actions on the data that is currently displayed.

group:android:checkableBehavior子类项的选择方式

noneNot checkable

allAll items can be checked (use checkboxes)

singleOnly 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属性设置组菜单项的选择模式

singleOnly one item from the group can be checked (radio buttons)allAll items can be checked (checkboxes)noneNo items are checkable

但是选择后我们要手动的改变状态,使用方法:setChecked()

相关推荐