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
相关产品推荐
相关产品推荐

