在ImageView中获取可绘制的ID

android android-imageview android-drawable

101474 观看

7回复

7491 作者的声誉

我有一个ImageView并设置了一个drawable。现在我需要ImageView动态获取可点击事件的ID 。我怎么才能得到它?

imgtopcolor = (ImageView) findViewById(R.id.topcolor); 
imgtopcolor.setImageResource(R.drawable.dr);  // How do I get this back?

现在触摸事件imgtopcolor我想要绘制id因为我每次都设置不同的drawable并且想要将drawable与其他

作者: chikka.anddev 的来源 发布者: 2010 年 12 月 24 日

回应 7


48

8848 作者的声誉

决定

我想如果我理解正确,那就是你在做什么。

ImageView view = (ImageView) findViewById(R.id.someImage);
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        ImageView imageView = (ImageView) view;
        assert(R.id.someImage == imageView.getId());

        switch(getDrawableId(imageView)) {
            case R.drawable.foo:
                imageView.setDrawableResource(R.drawable.bar);
                break;
            case R.drawable.bar:
            default:
                imageView.setDrawableResource(R.drawable.foo);
            break;
        }
    });

对?所以这个功能getDrawableId()不存在。您无法获得drawable实例化的id,因为id只是对设备上数据位置的引用,如何构造drawable。一旦构造了drawable,它就无法获得用于创建它的resourceId。但你可以使用标签让它像这样工作

ImageView view = (ImageView) findViewById(R.id.someImage);
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        ImageView imageView = (ImageView) view;
        assert(R.id.someImage == imageView.getId());

        // See here
        Integer integer = (Integer) imageView.getTag();
        integer = integer == null ? 0 : integer;

        switch(integer) {
        case R.drawable.foo:
            imageView.setDrawableResource(R.drawable.bar);
            imageView.setTag(R.drawable.bar);
            break;
        case R.drawable.bar:
        default:
            imageView.setDrawableResource(R.drawable.foo);
            imageView.setTag(R.drawable.foo);
            break;
        }
    });
作者: Greg Giacovelli 发布者: 2010 年 12 月 25 日

1

5196 作者的声誉

一个简单的解决方案可能是将drawable id存储在临时变量中。我不确定这对你的情况有多实用,但它肯定是一个快速解决方案。

作者: justinl 发布者: 2010 年 12 月 25 日

27

5690 作者的声誉

我已经在另一个问题上回答了这个问题,但是对于这个问题我会稍微改变一下。

不幸的是,没有getImageResource()getDrawableId()。但是,我使用ImageView标签创建了一个简单的解决方法。

在onCreate()中:

imageView0 = (ImageView) findViewById(R.id.imageView0);
imageView1 = (ImageView) findViewById(R.id.imageView1);
imageView2 = (ImageView) findViewById(R.id.imageView2);

imageView0.setTag(R.drawable.apple);
imageView1.setTag(R.drawable.banana);
imageView2.setTag(R.drawable.cereal);

然后,如果您愿意,可以创建一个简单的函数来获取可绘制的id:

private int getDrawableId(ImageView iv) {
    return (Integer) iv.getTag();
}

太容易了。

作者: Anonsage 发布者: 2013 年 1 月 23 日

0

10335 作者的声誉

更简单:只需将R.drawableid 存储在视图的id:use中v.setId()。然后把它拿回来v.getId()

作者: Peri Hartman 发布者: 2014 年 5 月 19 日

4

6439 作者的声誉

截至今天,该功能尚无支持。但是,我发现这个有点破解。

 imageView.setImageResource(R.drawable.ic_star_black_48dp);
 imageView.setTag(R.drawable.ic_star_black_48dp);

因此,如果您想获取视图的ID,只需获取它的标记即可。

if (imageView.getTag() != null) {
   int resourceID = (int) imageView.getTag();

   //
   // drawable id.
   //   
}
作者: ralphgabb 发布者: 2016 年 9 月 28 日

1

51 作者的声誉

挖掘StackOverflow以获得类似问题的答案,我发现人们通常建议采用两种方法:

  • 将drawable加载到内存中,并将ConstantState或bitmap本身与其他版本进行比较。
  • 将具有drawable id的标记设置到视图中,并在需要时比较标记。

就个人而言,我喜欢第二种出于性能原因的方法,但使用适当的标签标记一堆视图既痛苦又耗时。这在一个大项目中可能非常令人沮丧。在我的情况下,我需要编写很多Espresso测试,这些测试需要比较TextViewdrawables,ImageViewresources,Viewbackground和foreground。很多工作。

所以我最终提出了一个解决方案,将“脏”工作委托给自定义的inflater。在每个膨胀的视图中,我搜索特定属性,并使用资源ID(如果找到)为视图设置标记。这种方法与书法使用的几乎相同。我为此写了一个简单的库:TagView

如果使用它,则可以检索任何预定义标记,其中包含在xml布局文件中设置的可绘制资源ID:

TagViewUtils.getTag(view, ViewTag.IMAGEVIEW_SRC.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_LEFT.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_TOP.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_RIGHT.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_BOTTOM.id)
TagViewUtils.getTag(view, ViewTag.VIEW_BACKGROUND.id)
TagViewUtils.getTag(view, ViewTag.VIEW_FOREGROUND.id)

实际上,库支持任何属性。您可以手动添加它们,只需查看Github上的自定义属性部分。如果在运行时设置drawable,则可以使用方便的库方法:

setImageViewResource(ImageView view, int id)

在这种情况下,标记是在内部完成的。如果您使用Kotlin,您可以编写一个方便的扩展来调用视图本身。像这样的东西:

fun ImageView.setImageResourceWithTag(@DrawableRes int id) {
    TagViewUtils.setImageViewResource(this, id)
}

您可以在运行时标记中找到更多信息

作者: Bogdan Kornev 发布者: 2018 年 3 月 21 日

0

1 作者的声誉

我最近遇到了同样的问题。我通过实现自己的ImageView类解决了它。

这是我的Kotlin实现

class MyImageView(context: Context): ImageView(context) {
    private var currentDrawableId: Int? = null

    override fun setImageResource(resId: Int) {
        super.setImageResource(resId)
        currentDrawableId = resId
    }

    fun getDrawableId() {
        return currentDrawableId
    }

    fun compareCurrentDrawable(toDrawableId: Int?): Boolean {
        if (toDrawableId == null || currentDrawableId != toDrawableId) {
            return false
        }

        return true
    }

}
作者: kraspa11 发布者: 2019 年 3 月 21 日
32x32