基础部分可以参考我的另一篇博文

https://blog.csdn.net/nishigesb123/article/details/88698813

首先附赠一段FAQ

Q:

为什么我的item没有showAsAction这个属性?

强行写还会有如下提示

Should use app:showAsAction with the appcompat library with xmlns:app="http://schemas.android.com/apk/res-auto"

A:

首先从提示信息中可以看到,showAsAction应该在app这个命名空间。

然后观察一下xml文件的头部

发现并没有引入xmlns:app,所以根据提示引入 xmlns:app="http://schemas.android.com/apk/res-auto" 即可

即头部正确书写应该为👇,默认生成的可能和下面有所差别,所以不一定能够顺利使用这个属性

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

接下步入正题

从FAQ中也得到了一点信息,没错,showAsAction正是本文要提及的东西。

首先这个属性在Menus中常用有三个可选值always、ifRoom、never

实际上还有两个左右,但是和本文关系不大。

简单的用小学英语翻译一下,一直,如果空间、从不

其实这样就已经***不离十了,它们真正的含义下面一个一个分析👇

图片永远比文字更直观,不废话,先上图。


always(左为原始效果,右为添加属性后的效果)

OK,这样就很明显了,这个菜单项会一直显示在菜单上。

然后我们再多添加几个菜单项

<?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/t1"
        android:title="第一个菜单"
        android:orderInCategory="100"
        app:showAsAction="always"
        >
    </item>
    <item
        android:id="@+id/t2"
        android:title="第二个菜单"
        android:orderInCategory="200"
        app:showAsAction="always">
    </item>
    <item
        android:id="@+id/t3"
        android:title="第三个菜单"
        android:orderInCategory="300"
        app:showAsAction="always">
    </item>

    <item
        android:id="@+id/t4"
        android:title="第四个菜单"
        android:orderInCategory="400"
        app:showAsAction="always">
    </item>
    <item
        android:id="@+id/t5"
        android:title="第五个菜单"
        android:orderInCategory="500"
        app:showAsAction="always">
    </item>
    <item
        android:id="@+id/t6"
        android:title="第六个菜单"
        android:orderInCategory="600"
        app:showAsAction="always">
    </item>
</menu>

一口气来了6个,然而它也是有上限的,再标题都已经被“挤”出去了之后,实在挤不下了,就不再显示了。并且不通过一定的手段,你可能会没有办法找到其他被挤出去的菜单

最终结论:always会把所有菜单项暴力的显示再顶部直到所有的空间(甚至是标题栏)被用完,空间用完后剩余的选项将被隐藏。


ifRoom

OK always全部改成ifRoom

效果拔群...马上就可以得出结论

最终结论:ifRoom会判断空间的使用情况,在不影响原有组件的情况下,尽可能的把菜单项显示在顶部,并且把剩余的选项隐藏到右侧三个点中去。


never

OK ifRoom全部改成never

效果拔群+1...马上就可以得出结论(伪)

最终结论:never无论如何都将把菜单项隐藏到右侧的三个点中去(这不就和默认不添加该属性一样了?实际上可能在低版本的安卓中还是有一定差别的,毕竟还有一个菜单键的存在,就不测试了,有兴趣的可以自行测试)


然后,印象中的Menus可不长这样,应该是若干个按钮而且还有个小图片。

所以我们试试加个icon,have a try

用IfRoom来测试,用always其实也没事,never就不行了,毕竟藏在“...”的里的选项可没有位置显示图标

<?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/t1"
        android:title="第一个菜单"
        android:orderInCategory="100"
        app:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_dialog_map"
        >
    </item>
    <item
        android:id="@+id/t2"
        android:title="第二个菜单"
        android:orderInCategory="200"
        app:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_dialog_info">
    </item>
    <item
        android:id="@+id/t3"
        android:title="第三个菜单"
        android:orderInCategory="300"
        app:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_dialog_dialer">
    </item>

    <item
        android:id="@+id/t4"
        android:title="第四个菜单"
        android:orderInCategory="400"
        app:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_dialog_alert">
    </item>
</menu>

 

效果显示出来了

偷偷的告诉你,我们长按一下图标...还能显示菜单文本呢!

通过为不同的菜单项设置never/always/ifroom,我们可以轻松的控制那些关键的菜单以按钮形式显示,哪些隐藏在三个点中,叫了这么久的三个点,还是来个名字吧,实际上,它叫做溢出菜单