android 获取对象id,android-获取ImageVi中可绘制对象的ID

android-获取ImageVi中可绘制对象的ID

我有一个imgtopcolor并在其上设置了一个可绘制对象。 现在,我需要动态获取ImageView的click事件上的drawable的ID。 我怎么才能得到它?

imgtopcolor = (ImageView) findViewById(R.id.topcolor);

imgtopcolor.setImageResource(R.drawable.dr); // How do I get this back?

现在在imgtopcolor的触摸事件上,我想需要drawable id,因为我每次都设置不同的drawable并想将其与其他对象进行比较

7个解决方案

54 votes

我认为,如果我理解正确,这就是您正在做的事情。

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()不存在。 您无法获得实例化可绘制对象的ID,因为该ID只是对如何构造可绘制对象的设备上数据位置的引用。 一旦构造了可绘制对象,它就无法取回用于创建它的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 answered 2020-02-08T19:50:10Z

30 votes

我已经在另一个问题中回答了这样的问题,但是对于这个问题我只会做一点修改。

不幸的是,没有getImageResource()或2738943007079779793665。但是,我通过使用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 answered 2020-02-08T19:50:47Z

7 votes

截至今天,此功能尚不支持。 但是,我发现了这一点。

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 answered 2020-02-08T19:51:12Z

1 votes

一个简单的解决方案可能是将可绘制的ID存储在一个临时变量中。 我不确定这对您的情况有多实用,但这绝对是一个快速解决方案。

justinl answered 2020-02-08T19:51:32Z

1 votes

在StackOverflow上寻找类似问题的答案时,我发现人们通常会建议2种方法:

将一个可绘制对象加载到内存中,然后将ConstantState或位图本身与其他对象进行比较。

在视图中设置具有可绘制ID的标签,并在需要时比较标签那。

就个人而言,出于性能原因,我喜欢第二种方法,但是使用适当的标签标记一堆视图既痛苦又耗时。 在一个大型项目中,这可能会非常令人沮丧。 就我而言,我需要编写很多Espresso测试,这些测试需要比较TextView可绘制对象,ImageView资源,View背景和前景。 大量的工作。

因此,我最终想出了一种解决方案,将“肮脏”的工作委托给定制充气机。 在每个展开的视图中,我都会搜索特定的属性,然后为找到资源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上的“自定义属性”部分即可。如果在运行时设置可绘制对象,则可以使用便捷的库方法:

setImageViewResource(ImageView view, int id)

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

fun ImageView.setImageResourceWithTag(@DrawableRes int id) {

TagViewUtils.setImageViewResource(this, id)

}

您可以在运行时标记中找到其他信息

Bogdan Kornev answered 2020-02-08T19:52:29Z

0 votes

甚至更容易:只需将2738945345186186856ID存储在视图的ID中:使用v.setId()。然后使用v.getId()取回它。

Peri Hartman answered 2020-02-08T19:52:49Z

0 votes

我最近遇到了同样的问题。 我通过实现自己的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 answered 2020-02-08T19:53:13Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值