首页 > 解决方案 > API <= 24 的菜单项颜色未更新

问题描述

我在整个应用程序运行时更新 menuItem 颜色。而且,我遇到了一个奇怪的问题,即使用 SpannableString 设置 ForegroundColorSpan 不适用于 API <= 24 或 Android 7.0 及更早版本。它适用于 API >= 25。

下面的截图分别显示了 Android 7.0 和 Android 8.0 之间的区别。

安卓7.0

安卓8.0

下面是用于更新菜单中每个 menuItem 的辅助方法。

public static void updateMenu(Menu menu, int iconColor) {
    if (menu != null) {
        MenuItem menuItem;
        for (int m = 0; m < menu.size(); m++) {
            menuItem = menu.getItem(m);
            if (menuItem.getIcon() != null) {
                DrawableCompat.setTint(DrawableCompat.wrap(menuItem.getIcon()), iconColor);
            }
            if (!TextUtils.isEmpty(menuItem.getTitle())){
                SpannableString spanString = new SpannableString(menuItem.getTitle());
                spanString.setSpan(new ForegroundColorSpan(iconColor), 0, spanString.length(), 0);
                menuItem.setTitle(spanString);
            }
            if (menuItem.getActionView() instanceof ImageView) {
                ImageView imageView = (ImageView) menuItem.getActionView();
                DrawableCompat.setTint(DrawableCompat.wrap(imageView.getDrawable()), iconColor);
            }
        }
    }
}

在网上搜索答案时,我遇到了一些要求将 allCaps 设置为 false,但 menuItem 没有这样的属性。一种解决方案建议使用,

app:actionViewClass="androidx.appcompat.widget.AppCompatTextView"

但这也没有帮助,因为它带走了 menuItem 的可点击属性,我们必须单独处理点击,而不是对 menuItem 的所有点击都转到“onOptionItemSelected()”。

对此问题的任何帮助表示赞赏。

标签: androidandroid-toolbarandroid-8.0-oreoandroid-7.0-nougatspannablestring

解决方案


推荐阅读