如何检查当前图像资源附加到android xml中的ImageView?

Posted

技术标签:

【中文标题】如何检查当前图像资源附加到android xml中的ImageView?【英文标题】:How to check which current image resource is attached to ImageView in android xml? 【发布时间】:2014-06-14 23:31:48 【问题描述】:

我想检查哪个图像资源附加到 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(); 
    

【问题讨论】:

答案已更新,请查看 请告知我的答案是否适合您,因为我检查了我的代码它工作正常!我只是在为这个场景工作,花了一些时间在上面,我认为取得了成功! @JiteshUpadhyay 我似乎无法访问上下文?这也被弃用了吗? @Rekt 也许你可以通过 android 文档 【参考方案1】:

您好,请尝试如下

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(),能够完成任务。 感谢 Nlkolay 爵士,您更新的代码完成了我的工作。 最欢迎@Reena 和 SimplyProgrammer 嗨,为什么这个方法总是返回false,甚至图像src图像与imageResource参数相同? (R.mipmap.testImage) 您可以使用 ResourcesCompat 消除构建版本检查的需要,因为它是由 getDrawable() 函数完成的。【参考方案2】:

您可以执行以下操作,

通过 xml 或根据您的要求动态设置 tag

通过xml,

<ImageView
        android:layout_
        android:layout_
        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 的资源。 这是我使用的逻辑。谢谢 aha... setTag 和 getTag 非常棘手... 但是没关系。谢谢@SpringBreaker【参考方案3】:

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 适配器中使用它?【参考方案4】:

我面临同样的问题,但我在 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();

            
        
    


【讨论】:

你从哪里得到resources【参考方案5】:

你可以这样做。首先你需要像这样设置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");
            

【讨论】:

【参考方案6】:

我已经在这里回答了类似的话题:Get the ID of a drawable in ImageView。 该方法基于在自定义 LayoutInflater 中使用指定资源 id 标记视图。整个过程由一个简单的库TagView自动化。

因此,您可以仅通过 id 比较两个可绘制对象:

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

【讨论】:

以上是关于如何检查当前图像资源附加到android xml中的ImageView?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何将生成的临时图像附加到电子邮件中?

Android - 使用 xml drawable 制作检查图标

如何将电子邮件链接添加到布局 xml,Android

Android资源之图像资源(状态图像资源)

检查 UIImageView 中的图像不是占位符图像并附加到 UIImage 数组

如何将资源文件夹中的图像加载到android listview中