android menu

来源:互联网 发布:jsp mysql 用户注册 编辑:程序博客网 时间:2024/06/06 01:39
  • menu
  • ActionMode
  • PopupMenu

<item/>标签相关属性

app:showAsAction或者android:showAsAction,使用了support包则用前者,并且在<menu/>标签中加入:xmlns:app=”http://schemas.android.com/apk/res-auto
可选属性值:
- never:这个表示这个item只能在Action overflow中显示,就是只能点击三个点的图片才能看见
- ifRoom:设置这个属性时表示item在有限的空间内菜单会显示在Action Item快速的访问栏里,如果空间不够就显示在溢出菜单中,也就是三个点图标里面,这个也是经常使用的
- always: 这个值表示强制把菜单永远显示在Action Item快速访问栏中,也就是说这个Item 不会隐藏在溢出菜单中,这个值是不提倡的,因为如果Item过多的话每一个iItem都要强制显示在快速访问栏中的话就会导致UI布局混乱的
- withText: 显示Item的文本,在默认的情况下只是显示Action Item 的图标,如果想让Action Item 显示文本就需要设置这个属性, 比如 ifRoom|withText

orderInCategory:这个是item的位置,数字小的在上面

1. 选项菜单

重写public boolean onCreateOptionsMenu(Menu menu)public boolean onOptionsItemSelected(MenuItem item)方法
动态加载

public boolean onCreateOptionsMenu(Menu menu) {    menu.add(menu.NONE,1,1,"菜单1");    menu.add(menu.NONE,2,2,"菜单2");    menu.add(menu.NONE,3,3,"菜单3");    return true;}

上面的四个参数
- int groupId:组别,不分组可以写Menu.NONE
- int itemId:子菜单项Id,作为子菜单的唯一标识
- int order:菜单显示顺序 ,随便设,数字小的在最上面
- CharSequence title:菜单文本显示

menu对象有如下方法可以用来显示与隐藏菜单组
- 使用 setGroupVisible() 显示或隐藏项目
- 使用 setGroupEnabled() 启用或禁用项目
- 使用 setGroupCheckable() 指定项目是否可选中

静态加载

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item        android:id="@+id/menu1"        android:orderInCategory="1"    //这个是item的位置,数字小的在上面        android:title="菜单一" />    <item        android:id="@+id/menu2"        android:orderInCategory="2"        android:title="菜单二" />    <item        android:id="@+id/menu3"        android:orderInCategory="3"        android:title="菜单三" /></menu>
    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.main,menu); //这行代码的意思是:得到MenuInflater对象,把xml文件解析成Menu对象        return true;    }

菜单项点击事件

public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()){        case R.id.menu1:  //这个是xml中定义的item的id            Toast.makeText(MainActivity.this, "菜单一被选择了", Toast.LENGTH_SHORT).show();            break;        case R.id.menu2:            Toast.makeText(MainActivity.this, "菜单二被选择了", Toast.LENGTH_SHORT).show();            break;        case R.id.menu3:            Toast.makeText(MainActivity.this, "菜单三被选择了", Toast.LENGTH_SHORT).show();            break;    }    return true;}

2. 上下文菜单

xml文件中的item元素中的showAsAction属性默认应该是ifRoom

这里介绍的 actionmode 也是一种上下文菜单(context menu),不同于 android 3.0 之前的上下文菜单,这种新的上下文菜单不是长按一个 view,弹出一个悬浮菜单,而是长按一个view,显示一个新的 view,该 view 覆盖掉 toolbar。这两种不同的上下文菜单效果如下

两种上下文菜单的效果

大致实现流程是:实现ActionMode.Callback接口,并创建其对象——当达成触发条件时,调用startSupportActionMode(ActionMode.Callback callback)方法启动上下文菜单
现在不建议使用 Activity 的方法来启动上下文菜单,而是建议使用 toolbar 的方法 toolbar.startActionMode(ActionMode.Callback callback)
同时需要在 styles.xml 中设置

<!-- 让 ActionMode 能覆盖 toolbar --><!-- 此处toolbar的高度要用系统的actionbar高度,不能用自定义的高度 --><item name="windowActionModeOverlay">true</item><!--设置 ActionMode 的颜色--><item name="actionModeBackground">@color/colorPrimaryDark</item>

实现上下文菜单

实现ActionMode.Callback接口
需要实现的方法:
1. public boolean onCreateActionMode(ActionMode mode, Menu menu):创建菜单菜单
如果是inflate xml文件,那不能像选项菜单那样用getMenuInflater()来获取MenuInflater对象
而是需要使用mode.getMenuInflater()
2. public boolean onPrepareActionMode(ActionMode mode, Menu menu):菜单显示时被调用,可以什么都不做,直接返回false
3. public boolean onActionItemClicked(ActionMode mode, MenuItem item):菜单被点击后调用
4. public void onDestroyActionMode(ActionMode mode):菜单销毁后调用

达成触发条件,比如长按某个控件
示例代码:

tv.setOnLongClickListener(new View.OnLongClickListener() {    @Override    public boolean onLongClick(View v) {        //mActionMode是类中定义的字段        if(mActionMode!=null){            return false;        }        mActionMode = startSupportActionMode(callback);        //title和subtitle都可以不要        mActionMode.setTitle("title");        mActionMode.setSubtitle("subtitle");        return true;    }});

3. 弹出菜单

示例代码:

tv.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        //参数v是一个View对象,popupmenu将会在该view下面或者上面弹出来        PopupMenu popupMenu = new PopupMenu(MainActivity.this,v);        popupMenu.inflate(R.menu.popup);        popupMenu.show();    }});

相关方法
setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener listener)监听点击事件
setOnDismissListener(PopupMenu.OnDismissListener listener)监听菜单销毁事件

原创粉丝点击