Android推荐的三种基本菜单

概述

Google在开发者网站上关于Menu的API指南中为开发者推荐了三种基本的菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和弹出菜单(PopupMenu)。下面分别给出相应的基本实现步骤。

选项菜单(OptionsMenu)

效果图

实现步骤:

1、在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.android.peter.menudemo.MenuDemoActivity">
    <item
        android:id="@+id/action_1"
        android:orderInCategory="100"
        android:title="Option1"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_2"
        android:orderInCategory="100"
        android:title="Option2"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_3"
        android:orderInCategory="100"
        android:title="Option3"
        app:showAsAction="never" />
</menu>

2、在要显示OptionMenu的Activity里面重写onCreateOptionsMenu和onOptionsItemSelected方法。

    //创建菜单,加载我们之前定义的menu_main.xml布局文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main,menu);
        return true;
    }

    //当OptionsMenu被选中的时候处理具体的响应事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_1:
                Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_2:
                Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_3:
                Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
                return true;
            default:
                //do nothing
        }
        return super.onOptionsItemSelected(item);
    }

上下文菜单(ContextMenu)

效果图

实现步骤

1、在res下面创建一个menu文件夹,并新建一个xml文件作为ContextMenu的布局文件(这里我们复用上面OptionsMenu的布局文件)。

2、在要显示ContextMenu的Activity里面重写onCreateContextMenu和onContextItemSelected方法。

    //创建ContextMenu,加载我们之前定义的menu_main.xml布局文件
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.menu_main, menu);
    }

    //当ContextMenu被选中的时候处理具体的响应事件
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_1:
                Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_2:
                Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_3:
                Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
                return true;
            default:
                //do nothing
        }
        return super.onContextItemSelected(item);
    }

3、为控件添加长按响应属性,并绑定这个控件。

为TextView控件添加android:longClickable属性来响应用户长按点击事件。

<TextView
        android:id="@+id/tv_context_menu"
        android:layout_width="160dp"
        android:layout_height="60dp"
        android:padding="20dp"
        android:text="Context Menu"
        android:longClickable="true"
        android:gravity="center"
        />

将View与ContextMenu绑定。

private TextView mContextMenu;
mContextMenu = findViewById(R.id.tv_context_menu);

registerForContextMenu(mContextMenu);

弹出菜单(PopupMenu)

效果图

实现流程

1、在res下面创建一个menu文件夹,并新建一个xml文件作为PopupMenu的布局文件(这里我们复用上面OptionsMenu的布局文件)。

2、把PopupMenu相关逻辑封装到showPopupMenu()方法中,包含PopupMenu的实例化、布局设置、显示、添加MenuItem的点击监听及响应等。

    private void showPopupMenu(){
        PopupMenu popupMenu = new PopupMenu(this,mPopupMenu);
        popupMenu.inflate(R.menu.menu_main);
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()){
                    case R.id.action_1:
                        Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
                        return true;
                    case R.id.action_2:
                        Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
                        return true;
                    case R.id.action_3:
                        Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
                        return true;
                    default:
                        //do nothing
                }

                return false;
            }
        });
        popupMenu.show();
    }

3、与View绑定,当点击这个View的时候显示PopupMenu。

View在xml中的布局。

    <TextView
        android:id="@+id/tv_popup_menu"
        android:layout_width="160dp"
        android:layout_height="60dp"
        android:padding="20dp"
        android:text="Popup Menu"
        android:longClickable="true"
        android:gravity="center"
        android:background="@drawable/background"
        />

绑定View,点击显示。

    private TextView mPopupMenu;
    mPopupMenu = findViewById(R.id.tv_popup_menu);
        mPopupMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPopupMenu();
            }
        });

小结

通过比较发现,前两种方法实现起来是比较简单的,Activity中已经为我们提供了创建和响应的回调方法,我们只需要在创建菜单时把布局文件传递进去,然后在响应方法中实现对应项要做的事就可以了。不像第三种方法需要额外自己去创建实例并实现MenuItem的点击监听。在默认显示的位置上,OptionsMenu显示在右上角ActionBar的位置,ContextMenu能显示在控件视图范围内任何被点击的位置,PopupMenu与被点击控件左下角对齐显示。从三种菜单的实现效果图可以看出,默认的菜单显示样式是一样的。
菜单的实现方式不止这三种,更多的方法可以参看Android中的菜单实现汇总,开发者可以根据自己项目的需要选择适合自己的方法实现菜单。

Demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容