Android推荐的三种基本菜单

2018-03-12  本文已影响0人  peter_RD_nj

概述

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

上一篇下一篇

猜你喜欢

热点阅读