美文网首页
Android推荐的三种基本菜单

Android推荐的三种基本菜单

作者: peter_RD_nj | 来源:发表于2018-03-12 16:24 被阅读0次

    概述

    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

    相关文章

      网友评论

          本文标题:Android推荐的三种基本菜单

          本文链接:https://www.haomeiwen.com/subject/zygnfftx.html