• 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;
        }
    }
  • 相关阅读:
    linux三剑客之sed
    线程与循环的区别?
    Notify和NotifyAll的区别?
    no system images installed for this target这个问题如何解决?
    Intent里ACTION的CALL和DIAL的区别?
    onConfigurationChanged方法的使用
    String和StringBuffer的区别?
    Activity的状态保存
    C#将datatable数据转换成JSON数据的方法
    SQL语句:关于复制表结构和内容到另一张表中的SQL语句
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/9322190.html
Copyright © 2020-2023  润新知