android - API <= 24 的菜单项颜色未更新
问题描述
我在整个应用程序运行时更新 menuItem 颜色。而且,我遇到了一个奇怪的问题,即使用 SpannableString 设置 ForegroundColorSpan 不适用于 API <= 24 或 Android 7.0 及更早版本。它适用于 API >= 25。
下面的截图分别显示了 Android 7.0 和 Android 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()”。
对此问题的任何帮助表示赞赏。
解决方案
推荐阅读
- scala - 使用 scala chimney 将字符串变成密封特征
- bash - 调用 mailx 的 crontab 脚本失败,但相同的脚本在命令行上工作
- angular - 我怎样才能防止CombineLatest第一次触发
- reactjs - React Hook useEffect 内部的“dataURI”变量将在每次渲染后丢失
- python - selenium.common.exceptions.ElementNotInteractableException:消息:元素
无法通过键盘访问 - ios - 是否有某些静态单元填充了其余的视图?
- ruby-on-rails - Rails mail.deliver_later 不工作,而 mail.deliver 是
- javascript - 当事件发生在其子元素上时如何不更改事件偏移量
- javascript - 使用 Javascript 读取 JSON 文件
- python - 使用 selenium 在 Python 上进行网络抓取时找不到 div 类