You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 9及以下机型子菜单图标颜色异常问题修复咨询

问题原因

在 Android 9(API 28)及以下版本中,getResources().getDrawable() 返回的是全局共享的 Drawable 实例。你在循环里反复对同一个 Drawable 对象调用 setTint(),每次都会覆盖之前的颜色设置,最终所有子菜单项的图标都会继承最后一次设置的颜色。

修复方案

核心解决思路是为每个菜单项创建独立的 Drawable 实例,避免共享状态。通过 mutate() 方法可让 Drawable 变为可变副本,这样每个实例的 tint 设置不会互相影响。

修改后的代码如下:

.subscribe(labels -> labels.forEach(label -> {
    // 获取Drawable并创建可变副本
    Drawable drawable = getContext().getResources().getDrawable(R.drawable.ic_circle_outline).mutate();
    // 应用颜色 tint
    DrawableCompat.setTint(drawable, Color.parseColor(label.getLabelColor()));
    // 添加到子菜单
    subMenu.add(LABEL_GROUP, label.get_id(), label.get_id(), label.getName()).setIcon(drawable);
}), error -> Log.e(TAG, "", error));

更推荐使用 ContextCompat 兼容更多版本:

.subscribe(labels -> labels.forEach(label -> {
    Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_circle_outline).mutate();
    DrawableCompat.setTint(drawable, Color.parseColor(label.getLabelColor()));
    subMenu.add(LABEL_GROUP, label.get_id(), label.get_id(), label.getName()).setIcon(drawable);
}), error -> Log.e(TAG, "", error));
补充说明
  • mutate() 会断开 Drawable 与原始共享实例的关联,允许你独立修改该副本的属性(如 tint、尺寸等)。
  • Android 10(API 29)及以上版本中,getDrawable() 默认返回不可共享的实例,因此不会出现该问题,这也是仅旧机型触发此bug的原因。

内容的提问来源于stack exchange,提问作者Slava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:29:52