Android编程中如何以编程方式获取Drawable资源?
判断ImageView显示的Drawable对应的资源ID(替代废弃的getDrawable方法)
首先要指出你原来代码的两个问题:
getResources().getDrawable(int)方法已被废弃,AndroidX推荐使用ContextCompat.getDrawable()替代。- 直接将Drawable对象与资源ID(int类型)比较是错误的,两者类型不匹配,永远不会相等,所以你的判断逻辑根本不会生效。
以下是两种可行的解决方案:
方案一:设置Tag记录资源ID(推荐)
在给ImageView设置Drawable时,同时把对应的资源ID存为ImageView的Tag,后续直接通过Tag判断:
// 设置Drawable时 int targetResId = R.drawable.image; // 使用ContextCompat.getDrawable替代废弃方法 Drawable drawable = ContextCompat.getDrawable(this, targetResId); binding.image1.setImageDrawable(drawable); // 把资源ID存到Tag中 binding.image1.setTag(targetResId);
之后判断时直接取Tag对比:
if (binding.image1.getTag() != null && (int) binding.image1.getTag() == R.drawable.image) { // 执行你的业务逻辑 }
方案二:通过Drawable的ConstantState对比
如果无法主动设置Tag(比如Drawable是通过其他组件自动设置的),可以通过Drawable的ConstantState来判断是否为同一资源:
Drawable targetDrawable = ContextCompat.getDrawable(this, R.drawable.image); Drawable currentDrawable = binding.image1.getDrawable(); // 注意先判空,避免空指针异常 if (currentDrawable != null && targetDrawable != null && currentDrawable.getConstantState().equals(targetDrawable.getConstantState())) { // 执行你的业务逻辑 }
注意:此方法仅适用于同一资源文件的Drawable,若两个不同资源文件的Drawable内容完全一致,可能会出现误判,因此优先选择方案一。
内容的提问来源于stack exchange,提问作者Suraj Singh
相关产品推荐
相关产品推荐

