如何在Android XML中检查当前ImageView附加的图像资源?

55

我想检查在xml中附加了哪个图像资源到ImageView,我可以检查哪个图像资源附加到图像视图上,但我的要求是如何检查ImageView是否具有与我在xml中设置的相同资源,根据这个我需要执行一些操作。代码总是执行else部分。以下是我的代码:

  if (regProfile.getDrawable() == getResources().getDrawable( R.drawable.ivpic)) 
    {
      Toast.makeText(_con, "Image is ivPic", Toast.LENGTH_LONG).show(); 
      // new RegisterAsyntaskNew().execute(); 
    } 
  else 
    {
     Toast.makeText(_con, "Image isn't ivPic", Toast.LENGTH_LONG).show(); 
     // new RegisterAsyntask().execute(); 
    }

更新后的答案,请查看。 - Jitesh Upadhyay
请告知我的回答是否对您有用,根据我的代码检查,它应该是正常工作的!我只是为了场景而努力并花费了一些时间,最终获得了成功! - Jitesh Upadhyay
@JiteshUpadhyay 我好像无法访问Context?这也被弃用了吗? - Rekt
@Rekt,也许你可以浏览一下Android文档。 - Jitesh Upadhyay
6个回答

94

嗨,请按照以下方式尝试

if (regProfile.getDrawable().getConstantState() == getResources().getDrawable( R.drawable.ivpic).getConstantState()) 
{
  Toast.makeText(_con, "Image is ivPic", Toast.LENGTH_LONG).show(); 
  // new RegisterAsyntaskNew().execute(); 
} 
else 
{
 Toast.makeText(_con, "Image isn't ivPic", Toast.LENGTH_LONG).show(); 
 // new RegisterAsyntask().execute(); 
}

请使用.getConstantState()进行比较。
访问

http://developer.android.com/reference/android/graphics/drawable/Drawable.html

http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html

编辑:

.getResources().getDrawable(imageResource)

在API21中已经弃用,因此我修改了Jitesh Upadhyay的答案。

这是代码:

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public static boolean checkImageResource(Context ctx, ImageView imageView,
        int imageResource) {
    boolean result = false;

    if (ctx != null && imageView != null && imageView.getDrawable() != null) {
        ConstantState constantState;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            constantState = ctx.getResources()
                    .getDrawable(imageResource, ctx.getTheme())
                    .getConstantState();
        } else {
            constantState = ctx.getResources().getDrawable(imageResource)
                    .getConstantState();
        }

        if (imageView.getDrawable().getConstantState() == constantState) {
            result = true;
        }
    }

    return result;
}

谢谢Jitesh,通过使用.getConstantState(),我能够完成任务。 - Reena
谢谢您,Nlkolay先生。您的更新代码完成了我的工作。 - SimplyProgrammer
非常欢迎 @Reena 和 SimplyProgrammer。 - Jitesh Upadhyay
2
你好,为什么这个方法总是返回false,即使图像src和imageResource参数相同?(R.mipmap.testImage) - famfamfam
您可以使用ResourcesCompat,它消除了Build版本检查的需要,因为getDrawable()函数已经完成了该操作。 - Andrew Chelix

27
您可以按照以下方式进行操作:
通过xml或根据您的要求动态设置一个标签。
通过xml,
<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageview1" 
        android:background="@drawable/bg"
        android:tag="bg"/>

动态地说,

ImageView imageView=(ImageView)findViewById(R.id.imageview1);
imageView.setTag("bg");

使用 imageView.getTag() 获取图片信息。
String backgroundImageName = String.valueOf(imageView.getTag()); 

编辑:

如果你经常改变ImageView的背景,那么,

imageView.setTag(R.drawable.drawablename);
imageView.setImageResource(R.drawable.drawablename);
String backgroundImageName = String.valueOf(imageView.getTag());

现在您可以进行结账了。
if (backgroundImageName.equals("bg"))  // here "bg" is the tag that you set previously
    {
      Toast.makeText(_con, "Image is ivPic", Toast.LENGTH_LONG).show(); 
      // new RegisterAsyntaskNew().execute(); 
    } 
  else 
    {
     Toast.makeText(_con, "Image isn't ivPic", Toast.LENGTH_LONG).show(); 
     // new RegisterAsyntask().execute(); 
    }

谢谢您的回复,但是当我更改ImageView的图像时,应该执行else部分,这就是为什么我试图获取附加到ImageView的资源。 - Reena
这是我使用的逻辑。谢谢。 - viper
哦,setTag和getTag有点棘手...但没问题。谢谢@SpringBreaker。 - gumuruh

8

Kotlin中相同的解决方案:

if (regProfile.drawable.constantState == ContextCompat.getDrawable(this, R.drawable.ivpic).constantState) 
   { 
       Toast.makeText(_con, "Image is ivPic", Toast.LENGTH_LONG).show(); 
       // new RegisterAsyntaskNew().execute(); 
   } 
else 
   {
       Toast.makeText(_con, "Image isn't ivPic", Toast.LENGTH_LONG).show(); 
       // new RegisterAsyntask().execute(); 
   }

这个怎么在RecyclerView适配器中使用? - wbk727

1
我遇到了同样的问题,但是我在Kotlin Android中解决了它。
override fun onClick(v: View?) {

    when (v!!.getId()) {

        R.id.exo_fullscreen_button -> {
            if (exo_fullscreen_icon.drawable.constantState == resources.getDrawable( R.drawable.exo_controls_fullscreen_enter).constantState) {
                Toast.makeText(activity, "Correct Image ", Toast.LENGTH_LONG).show();

            }else{
                Toast.makeText(activity, "wrong image", Toast.LENGTH_LONG).show();

            }
        }
    }

}

1
你从哪里获取了 resources - wbk727

1
你可以这样做。首先,您需要设置ImageView的标签属性,如下所示。
 android:tag="ic_grade_grey_24dp"

if (viewHolder.imgfav.getTag().equals("ic_grade_grey_24dp"))  // here "bg" is the tag that you set previously
            {
                Toast.makeText(mContext, "ic_grade_black_24dp", Toast.LENGTH_LONG).show();
                // new RegisterAsyntaskNew().execute();
                viewHolder.imgfav.setImageResource(R.drawable.ic_grade_black_24dp);
                viewHolder.imgfav.setTag("ic_grade_black_24dp");
            }
            else
            {
                Toast.makeText(mContext, "Second", Toast.LENGTH_LONG).show();
                viewHolder.imgfav.setImageResource(R.drawable.ic_grade_grey_24dp);
                viewHolder.imgfav.setTag("ic_grade_grey_24dp");
            }

0

我已经在这里回答了类似话题:获取ImageView中Drawable的ID。 该方法基于使用自定义LayoutInflater将视图标记为指定资源ID。 整个过程由一个简单的库TagView自动完成。

因此,您可以通过它们的ID比较两个drawable:

TagViewUtils.getTag(regProfile, ViewTag.IMAGEVIEW_SRC.id) == R.drawable.ivpic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接