menu

Android一共有三种形式的菜单:
1.选项菜单(optinosMenu)
2.上下文菜单(ContextMenu)
3.子菜单(subMenu)
其中最常用的就是选项菜单(optionsMenu), 该菜单在点击 menu 按键 后会在对应的Activity底部显示出来。

options menu

默认样式是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第六项开始会被隐藏,在第六项会出现一个More里,点击More才出现第六项以及以后的菜单项,这些菜单项也被称作Expanded Menus。
按Menu键就会显示,用于当前的Activity。
它包括两种菜单项:
因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为 icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项。
而多于6的菜单项会以“more” icon menu来调出,称为 expanded menu。它不支持icon,其他的特性都和icon menu一样!
在Activity里面,一般通过以下函数来使用options menu:

Activity::onCreateOptionsMenu (Menu menu)
//创建options menu,这个函数只会在menu第一次显示时调用。
Activity::onPrepareOptionsMenu (Menu menu)
//更新改变options menu的内容,这个函数会在menu每次显示时调用。
Activity::onOptionsItemSelected (MenuItem item) 
//处理选中的菜单项。

context menu

要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。
这类型的菜单不支持icon和快捷键!
在Activity里面,一般通过以下函数来使用context menu:

Activity::registerForContextMenu(View view) 
//为某个view注册context menu,一般在Activity::onCreate里面调用。
Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
//创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。
Activity::onContextItemSelected(MenuItem item) 
//处理选中的菜单项。

以上两种menu都可以加入子菜单,但子菜单不能嵌套子菜单,这意味着在Android系统,菜单只有两层,设计时需要注意的!同时子菜单不支持icon。
xml形式的menu定义及应用

上述的三种类型的menu都能够定义为xml资源,但需要手动地使用 MenuInflater来得到Menu对象的引用。
一个菜单,对应一个xml文件,因为要求只能有一个根节点menu。官方说?xml声明可以不写,但我觉得还是写上好些,很多时候那个?xml声明主要是为了声明编码格式utf-8之类的。xml文件保存为res/menu/some_file.xml。Java代码引用资源: R.menu.some_file

接下来介绍相关的节点和属性(所有的属性都定义为android空间内,例如

菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。
<menu>标签没有任何属性,但可以嵌套在<item>标签中,表示子菜单的形式。不过<item>标签中不能再嵌入<item>标签。

1.<item>标签的属性含义如下:
Id:表示菜单项的资源ID
menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他    种类菜单项的后面。
orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值。例如menuCategory属性值都为system3个菜单项(item1、item2和item3)。将这3个菜单项的orderInCategory属性值设为321,那么item3会显示在最前面,而item1会显示在最后面。
title:菜单项标题(菜单项显示的文本)
titleCondensed:菜单项的短标题。当菜单项标题太长时会显示该属性值
icon:菜单项图标资源ID
alphabeticShortcut:菜单项的字母快捷键
numericShortcut:菜单项的数字快捷键
checkable:表示菜单项是否带复选框。该属性可设计为truefalse
checked:如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为truefalse
visible:菜单项默认状态是否可视
enable:菜单项默认状态是否被激活

2.<group>标签的属性含义如下:
id:表示菜单组的ID
menuCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组
orderInCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组
checkableBehavior:设置该组所有菜单项上显示的选择组件(CheckBox或Radio Button)。如果将该属性值设为all,显示CheckBox组件;如果设为single,显示Radio Button组件;如果设为none,显示正常的菜单项(不显示任何选择组件)。要注意的是,Android SDK官方文档在解释该属性时有一个笔误,原文是:
Whether the items are checkable. Valid values: none, all(exclusive/radiobuttons), single(non-exclusive/checkboxes).
相反了,正确应该是
all(non-exclusive/checkboxes),single(exclusive/radiobuttons).
visible:表示当前组中所有菜单项是否显示。该属性可设置的值是truefalse
enable:表示当前组中所有菜单项是否被激活。该属性可设置的值是truefalse

布局必须包括id和title

创建菜单:
(Android提供了两种创建菜单的方式)
1、在java代码创建菜单;
2、使用xml资源文件创建菜单(res/menu目录下)。建议使用后者。

ContextMenu 上下文菜单:

上下文菜单介绍:上下文菜单继承自android.view.Menu。

1、ContextMenu和OptionsMenu相比主要有以下区别:

1,ContextMenu必须通过Activity的registerForContextMenu(View)来进行注册,而OptionsMenu不用。
2,ContextMenu不支持icon,而OptionsMenu支持。
3,ContextMenu可以有头,可以通过setHeaderIcon,setHeaderTitle,setHeaderView来设置头,否则就没有头。
4,弹出的方式不一样。
5,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们调用registerForContextMenu(View view)来指定。

上下文菜单与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时被调用。

开发上下文菜单的步骤:

1、重写onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;

2、调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。

3、为菜单项提供响应,重写onContextItemSelected(MenuItem item)。

上下文菜单:

     registerForContextMenu(textView_main); //:为指定控件注册菜单

   //:onCreateContextMenu
    @Override
    // 选中被注册控件时调用,上下文: 长按调出选项:按一次调用一次
    public void onCreateContextMenu(ContextMenu menu, View v,  
                                    ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        getMenuInflater().inflate(R.menu.main_menu, menu);
    }

    //onContextItemSelected
    @Override
    public boolean onContextItemSelected(MenuItem item) {                            
        switch (item.getItemId()) {
            case R.id.action_red:
                textView_main.setTextColor(Color.RED);
                break;
            case R.id.action_blue:
                textView_main.setTextColor(Color.BLUE);
                break;
            case R.id.action_green:
                textView_main.setTextColor(Color.GREEN);
                break;
            case R.id.action_20:
                textView_main.setTextSize(20);
                break;
            case R.id.action_30:
                textView_main.setTextSize(30);
                break;
            case R.id.action_40:
                textView_main.setTextSize(40);
                break;
            case 1:
                Toast.makeText(this, "选项菜单一", Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(this, "选项菜单二", Toast.LENGTH_SHORT).show();
                break;
            case 3:
                Toast.makeText(this, "选项菜单三", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }



选项菜单:

@Override
    // 仅调用一次 ,点击调用选项:仅调用一次
    public boolean onCreateOptionsMenu(Menu menu) {
        //1.  通过menu的布局文件创建菜单(推荐)
        getMenuInflater().inflate(R.menu.main_menu, menu);

        //2.  java文件动态创建菜单
        menu.add(menu.NONE, 1, menu.NONE, "选项菜单一");
        menu.add(menu.NONE, 2, menu.NONE, "选项菜单二");
        menu.add(menu.NONE, 3, menu.NONE, "选项菜单三");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // 点击item时调用
        switch (item.getItemId()) {
            case R.id.action_red:
                textView_main.setTextColor(Color.RED);
                break;
            case R.id.action_blue:
                textView_main.setTextColor(Color.BLUE);
                break;
            case R.id.action_green:
                textView_main.setTextColor(Color.GREEN);
                break;
            case R.id.action_20:
                textView_main.setTextSize(20);
                break;
            case R.id.action_30:
                textView_main.setTextSize(30);
                break;
            case R.id.action_40:
                textView_main.setTextSize(40);
                break;
            case 1:
                Toast.makeText(this, "选项菜单一", Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(this, "选项菜单二", Toast.LENGTH_SHORT).show();
                break;
            case 3:
                Toast.makeText(this, "选项菜单三", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_setting"
        android:orderInCategory="10"
        android:title="设置"/>
    <item
        android:id="@+id/action_exit"
        android:orderInCategory="11"
        android:title="退出"/>
    <item
        android:id="@+id/action_about"
        android:orderInCategory="12"
        android:title="关于"/>
    <!-- 带子菜单的菜单 -->
    <item
        android:id="@+id/menu_group_color"
        android:title="颜色设置">
        <menu>
            <group>
                <item
                    android:id="@+id/action_red"
                    android:title="红色">
                </item>
                <item
                    android:id="@+id/action_blue"
                    android:title="蓝色">
                </item>
                <item
                    android:id="@+id/action_green"
                    android:title="绿色">
                </item>
            </group>
        </menu>
    </item>
    <item
        android:id="@+id/menu_group_size"
        android:title="大小设置">
        <menu>
            <group>
                <item
                    android:id="@+id/action_20"
                    android:title="20">
                </item>
                <item
                    android:id="@+id/action_30"
                    android:title="30">
                </item>
                <item
                    android:id="@+id/action_40"
                    android:title="40">
                </item>
            </group>
        </menu>
    </item>

</menu>

参考:
Android按键之Menu详解

Android UI学习 - Menu

Android的onCreateOptionsMenu()创建菜单Menu详解

Android 菜单(OptionMenu)大全 建立你自己的菜单

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值