AndroidAndroid技术知识Android 技术开发

Android Menuitem 各种坑

2016-12-30  本文已影响1314人  phantomvk

ToolBar上添加Menu,除搜索图标外其他的都收起来。修改ToolBar背景色为深灰色,然后才发现MenuItem里面的背景色还是原来白色。

修改颜色后,ToolBar为深灰,有搜索和菜单图标

ToolBar

打开菜单后

打开后的ToolBar

修改MenuItem背景颜色

原来res/values/styles.xml的配置

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorWeChatGray</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

修改后

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorWeChatGray</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="actionOverflowMenuStyle">@style/optionMenu</item>
    </style>

    <style name="optionMenu" parent="Widget.AppCompat.ActionBar.Overflow">
        <item name="android:popupBackground">@color/colorWeChatGray</item>
    </style>
</resources>

这样MenuItem的背景颜色就修改了

背景色修改

但这看起来明显不对劲:

修改文字颜色

我们先处理文字的颜色,添加android:textColor和对应的颜色即可

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorWeChatGray</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="actionOverflowMenuStyle">@style/optionMenu</item>
        <item name="android:textColor">@color/colorWhite</item>
    </style>

    <style name="optionMenu" parent="Widget.AppCompat.ActionBar.Overflow">
        <item name="android:popupBackground">@color/colorWeChatGray</item>
    </style>
</resources>
修改文字颜色

遮蔽ToolBar图标

遮蔽图标的问题比较好解决,
parent="Widget.AppCompat.ActionBar.Overflow">.Overflow去掉

处理遮蔽

MenuItem图标显示

上面的图片中MenuItem的Icon本来是不显示的,需要加入以下代码。在Android 5.0手机上测试可以用,Android 4.4及之前的还不清楚。

@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
    if (menu != null) {
        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
            try{
                Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                m.setAccessible(true);
                m.invoke(menu, true);
            } catch (Exception e) {
                Log.e(getClass().getSimpleName(), "onMenuOpened Exception", e);
            }
        }
    }
    return super.onPrepareOptionsPanel(view, menu);
}
上一篇 下一篇

猜你喜欢

热点阅读