android_menu

 菜单(Menu):是app中不可缺少的重要组成部分,贯穿整个app;

Android菜单分为3中类型:选项菜单(OptionMenu),上下文菜单(ContextMenu),弹出菜单(PopupMenu);

  OptionMenu 对应的是一个activity,一个activity只能有一个OptionMenu,ContextMenu,PopupMenu对应的事VIew

  activity中得每一个View都可以有对应的ContextMenu,PopupMenu;

可以在xml文件中进行菜单的编辑(推荐),也可以使用Java代码进行菜单的编辑(除非有特殊要求);

一:选项菜单(OptionMenu)

效果图:

 选项菜单的创建:

  1.xml菜单文件编写

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/app_bar_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="查找"
        app:showAsAction="collapseActionView|ifRoom" />
    <item
        android:id="@+id/it_new"
        android:title="新建" />
    <item
        android:id="@+id/it_save"
        android:title="保存" />
    <item
        android:id="@+id/it_more"
        android:title="更多" >
        <menu >
            <item
                android:id="@+id/it_rename"
                android:title="重命名" />
            <item
                android:id="@+id/it_delete"
                android:title="删除" />
        </menu>
    </item>
</menu>

  其中ShowAsAction是菜单的显示方式:always 始终显示在界面上  never 不显示在界面上,显示在(...)的列表中 

                   ifRoom 有空间则显示在界面上,没有则显示在列表中,

  2.在Java代码中重写OnCreatOptionMenu;

 //创建OptionMenu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //加载菜单资源,参数1:菜单资源索引 参数2:所要绑定菜单的对象
        getMenuInflater().inflate(R.menu.option, menu);
        //记得return true 否者菜单无法显示
        return true;
    }

  3..重写 onOptionItemSelected  设置点击事件

 //OptionMenu菜单选中项的方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
//        item.getItemId(); 获取选中项ID
        switch (item.getItemId()) {
            case R.id.app_bar_search:
                Toast.makeText(MainActivity.this, "查找", Toast.LENGTH_LONG).show();
                break;
            case R.id.it_new:
                Toast.makeText(MainActivity.this, "新建", Toast.LENGTH_LONG).show();
                break;
            case R.id.it_delete:
                Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show();
                break;
            case R.id.it_more:
                Toast.makeText(MainActivity.this, "更多", Toast.LENGTH_LONG).show();
                break;
            case R.id.it_rename:
                Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_LONG).show();
                break;
            case R.id.it_save:
                Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_LONG).show();

        }
        return super.onOptionsItemSelected(item);
    }

 二:上下文菜单(ContextMenu)

  1.xml菜单编写,新建xml文件(),可以是多个View对应不同的xml,也可以相同的xml

  2.在Java中注册对应的view

 //1.注册contextMenu,与控件进行绑定
        registerForContextMenu(findViewById(R.id.button1));

  3.重写OnCreatContextMenu

//覆盖onCreateContextMenu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        //加载菜单资源
        getMenuInflater().inflate(R.menu.context_menu, menu);
    }

  4.重写OnContextItemSelected  设置点击事件

   //f覆盖onContextItemSelected
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.ct_copy:
                Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG).show();
                break;
            case R.id.ct_delete:
                Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show();
                break;
            case R.id.ct_rename:
                Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_LONG).show();
                break;
        }
        return super.onContextItemSelected(item);
    }

  为按钮设置上下文操作模式:在顶部进行上下文操作

  1.实现ActionMode CallBack

     //①实现ActionMde CallBack,实例化对象
        ActionMode.Callback cb = new ActionMode.Callback() {
        //创建,在启动上下文模式操作(startActionMode(CallBack))时调用
        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            getMenuInflater().inflate(R.menu.context_menu,menu);
            return true;
        }
        //在创建方法后被调用
        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }
        //菜单项操作
        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.ct_copy:
                    Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG).show();
                    break;
                case R.id.ct_delete:
                    Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show();
                    break;
                case R.id.ct_rename:
                    Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_LONG).show();
                    break;
            }
            return false;
        }
        //操作模式结束时调用,操作栏消失即调用
        @Override
        public void onDestroyActionMode(ActionMode actionMode) {

        }
    };

  2.为view添加长按操作,启动上下文操作模式

 ②在View的长按中启动上下文操作模式
           findViewById(R.id.button2).setOnLongClickListener(new View.OnLongClickListener() {
               @Override
               public boolean onLongClick(View view) {
                   startActionMode(cb);//启动上下文操作模式
                   return false;
               }
           });

三:弹出菜单,在View的下方显示

  1.同样建立xml 菜单文件

  2.在Java中为View添加点击事件

//button3 演示popup menu
          final Button  button = findViewById(R.id.button3);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //1.实例化popupMenu对象 参数1.环境上下文 参数2,popupMenu依附的控件,出现在哪个控件的下方
                    PopupMenu pm = new PopupMenu(MainActivity.this,button);
                    //2.加载菜单资源,利用MenuInflater
                    pm.getMenuInflater().inflate(R.menu.popur,pm.getMenu());
                    //3.为PopupMenu创建监听器
                    pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem menuItem) {
                            switch (menuItem.getItemId()) {
                                case R.id.pp_copy:
                                    Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG).show();
                                    break;
                                case R.id.pp_delete:
                                    Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show();
                                    break;
                            }
                            return false;
                        }
                    });
                    //4.千万不要忘了这一步
                    pm.show();
                }
            });

  注意:最后要调用show()方法,否则菜单无法显示

 上面都是通过建立xml菜单资源文件,进行调用建立菜单,下面使用Java代码进行菜单的编写

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //参数1:组Id 参数2:菜单Id  参数3:菜单在列表中显示的序号id 参数4:菜单提示
        menu.add(1,101,1,"查找");
        menu.add(1,102,1,"新建");
        SubMenu sub = menu.addSubMenu(1,103,3,"更多");
        sub.add(2,201,1,"复制");
        sub.add(2,202,2,"粘贴");
        return true;
    }

  在进行点击事件的创建时,只需要将viewid改成菜单id即可

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
//        item.getItemId(); 获取选中项ID
        switch (item.getItemId()) {
            case 101:
                Toast.makeText(MainActivity.this, "查找", Toast.LENGTH_LONG).show();
                break;
            case 102:
                Toast.makeText(MainActivity.this, "新建", Toast.LENGTH_LONG).show();
                break;
    }
}
原文地址:https://www.cnblogs.com/conglingkaishi/p/9322190.html