如何通过代码修改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
相关产品推荐
相关产品推荐

