【Android】- UI常用组件 -Menu菜单


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、选项菜单OptionMenu(基于Activity)

点击右上角的点
出现菜单

1.重要属性

例:

< item android:title="保存"
      android:icon="@mipmap/ic_launcher"
     app:showAsAction="always|withText"/ >

showAsAction属性控制选项的显示方式。always表示一直显示;never表示不显示;withText表示图标和文本一起显示;ifRoom有空间就显示。

2.一些特点

3.设置方法

①在Android模式的res目录下新建一个Android Resource DirectoryResource Type 选择为menu。新建完后res目录下会有一个新的menu目录,右键menu目录,选择“New Resource File”创建一个菜单页面xml。
②设置这个菜单xml文件,可以直接用标签< menu >和< item >嵌套设置(最多嵌套两层),也可以在design视图拖拽元件实现。需要时给item选项设置id,以便对应的Activity中的函数对用户选择进行处理。
③在对应的Activity中重写onCreateOptionsMenu(Menu menu) 方法。该方法的作用是绑定菜单资源。

 public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.option,menu);//R.menu.optionius菜单页面xml
     return true;
 }

④重写onOptionsItemSelected方法。

    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.save:
                Toast.makeText(this,"保存!",Toast.LENGTH_LONG).show();
                break;
            case R.id.newone:
                Toast.makeText(this,"新建!",Toast.LENGTH_LONG).show();
                break;
            case R.id.back:
                Toast.makeText(this,"回退!",Toast.LENGTH_LONG).show();
                break;
            case R.id.exit:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
   }

二、选项菜单ContextMenu(基于View)

1.重要属性

2.一些特点

3.设置方法

普通模式:

①在onCreate方法中为一个view注册菜单
 registerForContextMenu(findViewById(R.id.btn_content_menu));

②重写onCreateContextMenu方法,将view与菜单绑定

 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.option,menu);
    }

③重写onContextItemSelected方法,对相应选择进行处理。

上下文操作模式:
在这里插入图片描述

①在Activity中实现 ActionMode.Callback接口,并实现其中的方法。在启动上下文操作时调用

ActionMode.Callback db=new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            Toast.makeText(MainActivity.this,"创建!",Toast.LENGTH_LONG).show();
            getMenuInflater().inflate(R.menu.option,menu);
            return true;
        }
        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            Toast.makeText(MainActivity.this,"准备!",Toast.LENGTH_LONG).show();
            return false;
        }
        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            switch (menuItem.getItemId()){
                case R.id.save:
                    Toast.makeText(MainActivity.this,"保存!",Toast.LENGTH_LONG).show();
                    break;
                case R.id.newone:
                    Toast.makeText(MainActivity.this,"新建!",Toast.LENGTH_LONG).show();
                    break;
                case R.id.back:
                    Toast.makeText(MainActivity.this,"回退!",Toast.LENGTH_LONG).show();
                    break;
                case R.id.exit:
                    finish();
                    break;
            }
            return false;
        }
        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            Toast.makeText(MainActivity.this,"结束!",Toast.LENGTH_LONG).show();
        }
    };

②在onCreate方法中设置view的长按事件,在长按事件中启动上下文操作模式。

  findViewById(R.id.btn_content_menu).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                startActionMode(cb);
                return false;
            }
        });

三、浮动菜单PopupMenu(基于View)

在这里插入图片描述

1.重要属性

2.一些特点

3.设置方法

例子:点击button弹出PopupMenu菜单以供用户选择
简单来说,完成该例需要
①首先通过findViewById获得触发菜单弹出的view,为这个view设置监听事件。如该例中是一个button,监听事件是弹出菜单以供用户选择,故在监听事件中需要创建菜单(确定出现位置)、绑定菜单资源(确定菜单样式)、完成菜单交互功能(确定选项功能)、显示菜单。
②在监听事件中,首先用“ PopupMenu menu=new PopupMenu(MainActivity.this,btn_popup)”创建一个PopupMenu对象menu,实参为上下文和锚点,这两个参数决定了菜单以什么为参照在什么位置弹出(一般是贴着锚点元件下方弹出)。
再通过“ getMenuInflater().inflate(R.menu.option,menu.getMenu());”将我们制作的菜单样式资源R.menu.option.xml添加到 PopupMenu对象调用getMenu()方法返回的菜单对象中。
然后为PopupMenu对象设置点击事件处理弹出菜单的交互。
最后“ menu.show();”PopupMenu对象调用show方法显示菜单。

     final Button btn_popup=findViewById(R.id.btn_popup_menu);//引发菜单出现的相应“入口”View,此处是按钮。
     btn_popup.setOnClickListener(new View.OnClickListener() {//监听事件
         @Override
         public void onClick(View view) {
             PopupMenu menu=new PopupMenu(MainActivity.this,btn_popup);//创建一个PopupMenu类对象,确定菜单出现位置
             getMenuInflater().inflate(R.menu.option,menu.getMenu());//将菜单样式添加到菜单对象(与optionMenu和ContextMenu不同的是,这个菜单对象通过PopupMenu对象调用getMenu()返回)
             menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {//为弹出菜单设置监听器处理交互事件
                 @Override
                 public boolean onMenuItemClick(MenuItem menuItem) {
                     selectResult(menuItem);//这是一个处理交互事件的自定义函数,与前面的菜单类似,就是判断menuItem作相应处理
                     return false;
                 }
             });
             menu.show();
         }
     });

四、总结

1.无论是哪一种菜单都可以通过getMenuInflater().inflate(菜单样式资源,定义的菜单);将菜单样式与具体声明的菜单绑定。
2.OptionMenu是基于Activity的,故而一个Activity只会出现一个OptionMenu,所以Activity中直接重写onCreateOptionsMenu和onOptionsItemSelected方法就能设置菜单。
普通模式的上下文菜单ContentMenu比OptionMenu多一步是在onCreate方法中用“ registerForContextMenu(findViewById(R.id.btn_content_menu));”(R.id.btn_content_menu是触发菜单弹出的响应元件的id)为某个view(包括其派生类)注册上下文菜单,然后重写onCreateContextMenu和onContextItemSelected方法。所以普通模式的上下文菜单尽管可以为多个按钮注册上下文菜单,但它们注册的上下文菜单的样式和交互是同样的,通过重写那两个方法设置的。
而上下文操作模式的上下文菜单是通过在Activity中new一个对象a实现 ActionMode.Callback接口,菜单的实现细节在接口需要重写的方法中,然后在触发菜单的元件的点击监听事件中 startActionMode(a);就行。所以在一个Activity中可以有多个不同的上下文操作模式的上下文菜单。
PopupMenu的设置方法则是在onCreate中给触发菜单的元件设置点击监听事件,在监听事件中定义PopupMenu对象、样式资源和PopupMenu对象绑定、设置菜单交互、显示菜单。
3.onCreateOptionsMenu和onOptionsItemSelected方法都要返回true,表示操作已经完成。在onOptionsItemSelected的switch语句的default标签中可以 写 super.onOptionsItemSelected(item);语句,当没有匹配的结果就可以调用父类进行处理。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值