欢迎回来Android入门教程的第十九期,本期来继续讲讲ToolBar与Menu的配合。你也许会注意到,许多手机app的标题栏右上角或许会有一两个按钮或一个菜单,那么这个功能我们可以通过menu来实现。

首先我们来介绍一下menu的结构,进到res目录下找到menu包,若没有就自己创建一个同名包。

我们直接右键menu这个包,弹出的菜单就已经可以自动识别创建menu了,选择New Menu Resource File,名字可以随意取。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_test"
        android:title="测试菜单"
        app:showAsAction="never"/>
</menu>

我们来试着简单添加一个菜单项,现在我们将这个菜单挂载到Activity来试试效果如何。

回到MainActivity,下面我们要用到两个方法,一个是onCreateOptionsMenu,一个是onOptionsItemSelected。

分别是创建菜单时和菜单项被选择时的监听事件,这两个是@Override方法,也就是Activity的父方法,可以直接创建出来。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        return true;
    }

这样我们就将刚才写好的menu挂载上去了,实机运行后你会发现右上角多出了三个小点,点开就是刚才的菜单。

下面我们继续详细讲讲menu,回到刚才写好的menu,会发现一个叫做app:showAsAction的属性,这个属性就决定了这个项目是否要直接显示在ActionBar还是以三点收缩菜单的方式展示。

app:showAsAction 有下面三个属性:

  1. ifRoom 意为在屏幕宽度允许的情况下直接显示在ActionBar,否则收缩进菜单
  2. never 意为不直接显示在ActionBar,收缩在菜单中
  3. always 意为总是显示在ActionBar,空间不足则不显示

同样的,我们可以为item指定android:icon,这样如果我们用了always或ifRoom值,那么这个项目将会以图标的方式展示出来。

最后来看看 onOptionsItemSelected 的用法,如下所示

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_test:
                break;
        }
        return true;
    }

可以通过给出的MenuItem来获取到被点击的项目MenuItem.getItemId() 用于获取被点击项目的id,也就是上面我们给item写好的android:id属性,这样就可以实现菜单的点击事件了。

最后补充一个小问题,现在你可能会发现你的菜单背景是黑色的,这是因为我们没有给ToolBar指定popupTheme,这个theme是给popupWindow用的,也就是弹出菜单,只需将app:popupTheme=”@style/AppTheme.PopupOverlay”添加到ToolBar即可。


那么本期简单的介绍了Menu的使用,但Menu不仅仅适用于ActionBar,在NavigationView也常用。下期就来讲讲Fragment与ViewPager的配合使用。


0 条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注