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

如何通过代码修改LinearLayout中ImageView的Drawable颜色?

解决ImageView通过代码修改src图标颜色的问题

你的问题核心是操作对象错误:你之前的三段代码都在修改View的Background,但你的ImageView是通过android:src设置的图标,而非android:background,所以getBackground()返回的是null,所有颜色修改操作自然不会生效。

正确实现方式

方法1:通过ID直接获取ImageView(推荐,避免布局变化导致的索引错误)

使用setImageTintList(API 21及以上支持,官方推荐的着色方式):

ImageView starOne = findViewById(R.id.star_one);
// 若使用AndroidX或API 23+,建议用ContextCompat.getColor(this, R.color.red)
starOne.setImageTintList(ColorStateList.valueOf(getResources().getColor(R.color.red)));

方法2:使用setColorFilter(兼容低版本API)

如果需要适配API 21以下的版本,可以对src对应的Drawable设置颜色滤镜:

ImageView starOne = findViewById(R.id.star_one);
Drawable starDrawable = starOne.getDrawable();
if (starDrawable != null) {
    starDrawable.setColorFilter(getResources().getColor(R.color.red), PorterDuff.Mode.SRC_IN);
    // 通知视图刷新
    starOne.invalidate();
}

方法3:通过LinearLayout的getChildAt获取视图

注意要先将子View强转为ImageView,再操作其src对应的Drawable:

LinearLayout linearLayout = findViewById(R.id.power_left);
ImageView starOne = (ImageView) linearLayout.getChildAt(0);
starOne.getDrawable().setColorFilter(getResources().getColor(R.color.red), PorterDuff.Mode.SRC_IN);
starOne.invalidate();

额外说明

  • 优先使用setImageTintList,它支持颜色状态列表(比如选中/未选中的不同颜色),是官方设计的标准着色API,兼容性和稳定性更好。
  • 如果你的star_power_left是VectorDrawable,需在build.gradle中开启兼容支持:
android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:10:17