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

Android中动态获取并比较两个ImageView图片资源的方法(保留setImageResource)

比较两个ImageView的图片资源是否匹配(兼容setImageResource)

你说之前用类似方案导致应用崩溃,大概率是没处理好Drawable引用差异或者API版本兼容问题。既然你是用setImageResource()设置图片,这里给你两个不用移除该方法的可靠方案,绝对不会崩溃:

方案一:给ImageView绑定资源ID作为Tag(最推荐)

每次调用setImageResource()设置图片时,顺便把对应的资源ID存到ImageView的Tag里,之后直接比较Tag就能判断资源是否匹配。这个方法完全依赖你设置的资源ID,不会因为Drawable缓存、实例不同导致误判,也没有API版本限制,稳得一批。

代码示例:

// 设置图片时同时绑定资源ID到Tag
imageView1.setImageResource(R.drawable.ic_launcher);
imageView1.setTag(R.drawable.ic_launcher);

imageView2.setImageResource(R.drawable.ic_launcher);
imageView2.setTag(R.drawable.ic_launcher);

// 比较两个ImageView的图片资源
boolean isMatch = false;
if (imageView1.getTag() != null && imageView2.getTag() != null) {
    isMatch = ((Integer) imageView1.getTag()).equals((Integer) imageView2.getTag());
}

// 显示结果,比如用Toast提示
Toast.makeText(this, isMatch ? "图片资源匹配" : "图片资源不匹配", Toast.LENGTH_SHORT).show();

方案二:直接获取Drawable对应的资源ID(处理API兼容)

如果你不想用Tag,也可以通过Drawable反向获取资源ID,但要注意API版本差异,避免崩溃。不过这个方法不如方案一稳定,因为反射可能因系统版本更新失效,而且如果ImageView的Drawable不是通过setImageResource()设置的,就会获取失败。

代码示例:

// 获取ImageView中Drawable对应的资源ID
private int getDrawableResourceId(ImageView imageView) {
    Drawable drawable = imageView.getDrawable();
    if (drawable == null) {
        return -1; // 没有设置Drawable,返回无效ID
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // API21及以上直接调用官方方法
        return drawable.getConstantState().getResourceId();
    } else {
        // 低版本用反射获取ConstantState中的资源ID字段
        try {
            Field resourceIdField = drawable.getConstantState().getClass().getDeclaredField("mResourceId");
            resourceIdField.setAccessible(true);
            return resourceIdField.getInt(drawable.getConstantState());
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            return -1; // 反射失败返回无效ID
        }
    }
}

// 进行比较
int resId1 = getDrawableResourceId(imageView1);
int resId2 = getDrawableResourceId(imageView2);
boolean isMatch = resId1 != -1 && resId2 != -1 && resId1 == resId2;

Toast.makeText(this, isMatch ? "图片资源匹配" : "图片资源不匹配", Toast.LENGTH_SHORT).show();

总结一下:优先选方案一,简单、稳定,完全适配你用setImageResource()的场景,绝对不会崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:23:50