ActionBar 溢出菜单和兼容问题解决

      当我们想做一个类似于微信菜单

很快我们应该可以想到可以用support-v7包或者actionbarshecklock,然后就写menu布局,如下

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

    <!-- add submenu -->
    <item
        android:id="@+id/menu_add"
        android:icon="@drawable/actionbar_add_icon"
        android:showAsAction="always"
        android:title="@string/description">
        <menu>
            <item
                android:icon="@drawable/actionbar_camera_icon"
                android:showAsAction="ifRoom|withText"
                android:title="拍照"/>
            <item
                android:icon="@drawable/actionbar_facefriend_icon"
                android:showAsAction="ifRoom|withText"
                android:title="群聊"/>
            <item
                android:icon="@drawable/actionbar_particular_icon"
                android:showAsAction="ifRoom|withText"
                android:title="我的微信"/>
            <item
                android:icon="@drawable/actionbar_search_icon"
                android:showAsAction="ifRoom|withText"
                android:title="搜索"/>
        </menu>
    </item>

    <!-- more submenu -->
    <item
        android:id="@+id/menu_more"
        android:icon="@drawable/actionbar_more_icon"
        android:showAsAction="ifRoom"
        android:title="@string/description">
        <menu>
            <item
                android:icon="@drawable/ofm_add_icon"
                android:showAsAction="ifRoom|withText"
                android:title="添加"/>
            <item
                android:icon="@drawable/ofm_card_icon"
                android:showAsAction="ifRoom|withText"
                android:title="银行卡"/>
            <item
                android:icon="@drawable/ofm_collect_icon"
                android:showAsAction="ifRoom|withText"
                android:title="我的收藏"/>
            <item
                android:icon="@drawable/ofm_delete_icon"
                android:showAsAction="ifRoom|withText"
                android:title="删除"/>
        </menu>
    </item>

</menu>

然后就是在onCreateOptionsMenu中调用一下menu布局,貌似一切都大功告成了,在类似于nexus5这样的机子跑起来貌似也没啥问题,但当你在魅族机子上面跑起来的时候会发现出现很奇怪的现象,如下图

      个人猜测,魅族这类机子对菜单键进行了定制,对溢出菜单会有自己的一些处理方式,那么怎么解决这个问题,而且使用这种传统做法,你会发现subMenu之 恩只能添加icon和title,而不能实现类似微信那种除了icon和title,还有小红点的效果,这时候可以考虑用ActionProvider。

    ​ActionProvider官方文档解释为为单个menu控件定义丰富的menu交互。。。。。这恰恰是我想要的。。。

     ​要使用ActionProvider,首先要继承ActionProvider写一个自定义的ActionProvider类,这个可以参考 ShareActionProvider。然后通过android:actionProviderClass属性在menu布局里导入。

     ​利用ActionProvider,我们可以实现和刚才一模一样的效果,而且不会出现那魅族兼容的问题,我们只需要在onPrepareSubMenu 方法里面进行一些操作就行了,当然我们用ActionProvider还可以实现更复杂的效果,因为它里面的ActionView可以完全自定义,我们只 需要在onCreateActionView做对应处理就行;譬如说我们就要简单实现类似微信一样除了icon和title,还有小红点的效果,具体见 demo,在此不详述。。。

demo地址:仿微信 actiobar溢出菜单

原文地址:https://www.cnblogs.com/adison/p/3761248.html