本节课讲Android中的菜单(menu)资源,这个也是我们在开发中可能经常用到的资源,它可以分为以下几种类型:
- option menu(选项菜单)
- sub menu(子菜单)
- context menu (上下文菜单)
- popup menu(弹出菜单)

菜单在Android具有特殊性,几乎所有应用都离不开它,随着Android的发展,菜单也展示方式也跟着变化,我们初学它的时候先理解这个东西具体用来的干嘛的,然后才跟着细节去学习实现,总而言之,一节课可以讲的内容很有限,把所有东西全都列全在这里效果也不明显,我们先了解它的基本用法,然后再学习过程中遇到特殊的需求再来丰富它的实现。

option menu(选项菜单)

这个是Android中最常规的菜单,在我们的Activity中它只包含一个菜单,一个菜单可以包含多个菜单项和多个子菜单。

在Android 2.3 或者更低版本的SDK提供了以下的菜单效果:
A010-menu资源_第1张图片
以上旧的菜单展现形式现在应用基本上很少见了,就算有也不会用菜单来实现,更多的可能使用以下这种形式,以actionbar来给用户一些常用操作,使用溢出菜单来隐藏更多不常用功能:
A010-menu资源_第2张图片

我们实际开发中可以有两种实现菜单的方式:
- 硬编码
- xml文件

硬编码

可以看一下直接使用代码来添加菜单如何操作:
A010-menu资源_第3张图片

我们在Activity中复写onCreateOptionMenu方法,然后通过menu对象调用其的重载方法来添加菜单项或者子菜单。

这里解释一些重载方法四个参数:
- groupId : 组别id
- itemId:菜单项id
- order:排序
- titleRes:标题(可以是字符串资源,也可以是int引用资源)

我们设置参数的时候,设置同样的groupId说明归为同一组。

eg:

  // 定义菜单项id    private static final int ITEM1 = Menu.FIRST;    private static final int ITEM2 = Menu.FIRST + 1;    private static final int ITEM3 = Menu.FIRST + 2;    private static final int ITEM4 = Menu.FIRST + 3;    private static final int ITEM5 = Menu.FIRST + 4;    private static final int ITEM6 = Menu.FIRST + 5;    private static final int ITEM7 = Menu.FIRST + 6;    private static final int ITEM8 = Menu.FIRST + 7;    private static final int ITEM9 = Menu.FIRST + 8; @Override    public boolean onCreateOptionsMenu(Menu menu) {        // 采用硬编码的形式实现菜单        // 直接设置标题// menu.add("菜单项1");// menu.add("菜单项2");        menu.add(1, ITEM1, 1, "菜单项1");        menu.add(1, ITEM2, 2, "菜单项2");        menu.add(2, ITEM3, 3, "菜单项3");        menu.add(2, ITEM4, 4, "菜单项4");        // 添加子菜单        SubMenu subMenu = menu.addSubMenu(1, ITEM5, 5, "子菜单1");        subMenu.add(1, ITEM7, 1, "子菜单项1");        subMenu.add(1, ITEM8, 2, "子菜单项2");        subMenu.add(1, ITEM9, 3, "子菜单项3");        menu.addSubMenu(1, ITEM6, 6, "子菜单2");        // Inflate the menu; this adds items to the action bar if it is present.// getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }

如何响应菜单点击事件?

 @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case ITEM1:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM2:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM3:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM4:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM5:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM6:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM7:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM8:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;            case ITEM9:                Toast.makeText(this,"你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();                break;        }        return true;    }

效果如下:
A010-menu资源_第4张图片

xml文件

这种方式可以让我们开发者更方便得指定菜单,这样我们就不用去设定指定的itemId,而是由Android为我们随意生成指定id,这样的话我们在响应的时候,根据在xml指定id来判断即可。

eg:

    <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=".MainActivity">    <!-- group1 -->    <group android:id="@+id/group1">        <item  android:id="@+id/mi1" android:title="item1" />        <item  android:id="@+id/mi2" android:title="item2" />    </group>    <!-- group 2 -->    <group android:id="@+id/group2">        <item  android:id="@+id/mi3" android:title="item3" />        <item  android:id="@+id/mi4" android:title="item4" />    </group></menu>

然后再onCreateOptionMenu中这样加载:

 getMenuInflater().inflate(R.menu.menu_main, menu);

响应事件就不说了,跟硬编码的响应方式一样。

Context Menu(上下文菜单)

上下文菜单跟选项菜单有点区别,后者是响应Activity的操作,而前者是响应View的操作。

如何使用?

注册上下文菜单

 private Button contextMenuButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        contextMenuButton = (Button) findViewById(R.id.button);        registerForContextMenu(contextMenuButton);    }

生成上下文菜单

 @Override    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {        // set context menu title        menu.setHeaderTitle("文件操作");        // add context menu item        menu.add(0, 1, Menu.NONE, "发送");        menu.add(0, 2, Menu.NONE, "标记为重要");        menu.add(0, 3, Menu.NONE, "重命名");        menu.add(0, 4, Menu.NONE, "删除");        super.onCreateContextMenu(menu, v, menuInfo);    }

响应上下文

@Override    public boolean onContextItemSelected(MenuItem item) {        // 得到当前被选中的item信息        AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();        Log.v(TAG, "context item seleted ID=" + menuInfo.id);        switch (item.getItemId()) {            case 1:                // do something                break;            case 2:                // do something                break;            case 3:                // do something                break;            case 4:                // do something                break;            default:                return super.onContextItemSelected(item);        }        return true;    }

ok,当我们长按指定上下文的view,就会弹出上下文菜单:

A010-menu资源_第5张图片

这个菜单跟Context Menu类似,也是响应View的操作的,比如我们响应一个按钮,点击按钮就弹出菜单项,它的操作上就不用像上下文菜单那样要长按。

eg:

public void showPopupMenu(View view) {        PopupMenu popupMenu = new PopupMenu(this, view);        MenuInflater inflater = popupMenu.getMenuInflater();        inflater.inflate(R.menu.menu_main, popupMenu.getMenu());        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                switch (item.getItemId()) {                    case R.id.mi1:                        // do something                        break;                    case R.id.mi2:                        // do something                        break;                    case R.id.mi3:                        // do something                        break;                    case R.id.mi4:                        // do something                        break;                }                return false;            }        });        popupMenu.show();    }

效果:
A010-menu资源_第6张图片

最后

关于Android的几种类型的菜单已经介绍完,基本用法就如本篇博客所说,相信大家学完本节课就比较清楚如何对菜单进行操作,如果想获得更多关于menu资源的知识,可以到官网查询,这里我就不多说了。我们可以看到Android的版本迭代更新很快,每一个版本都会有新的改进,从以往的option menu到actionbar再到toolbar,android给我们的体验也不断改进,这意味着技术在变更,很多东西都在以一种新的面貌出现,我们需要不断更新自己的知识体系才能更好的跟上时代的步伐,本节课就到这里,谢谢大家。

小巫的博文会同步更新到我的微信公众号,欢迎大家关注:

A010-menu资源_第7张图片

更多相关文章

  1. Android依赖注入:Google Guice on Android的使用及相关资源
  2. ANDROID资源文件
  3. 【Based Android】PreferenceActivity设置菜单介绍(续)
  4. Android自学 --点击事件以及弹出菜单
  5. android字符串资源字符format
  6. Android之Android apk动态加载机制的研究(二):资源加载和activity生
  7. 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻
  8. android 资源ID规则
  9. android 资源文件命名规则 drawable mipmap一样的

随机推荐

  1. Android中minSdkVersion、targetSdkVersi
  2. Android中attr自定义属性详解
  3. React Native與Android交互
  4. Android(安卓)Launcher3去除应用列表,二级
  5. Android(安卓)Studio 调试工具常见问题
  6. 整理一下Android中的ListView
  7. Android中使用ALSA声卡
  8. RelativeLayout相对布局
  9. 使用Android(安卓)Studio解决Android(安
  10. android 中targetSdkVersion和与target属