我有一个ImageView
并在其上设置了一个drawable。现在我需要动态获取ImageView
点击事件的drawable ID。我怎么能得到它?
imgtopcolor = (ImageView) findViewById(R.id.topcolor);
imgtopcolor.setImageResource(R.drawable.dr); // How do I get this back?
现在触摸事件imgtopcolor
我想要绘制id,因为我每次都设置不同的drawable并希望将drawable与其他颜色进行比较
答案 0 :(得分:49)
我想如果我理解正确,那就是你在做什么。
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;
}
});
答案 1 :(得分:28)
我已经在另一个问题上回答了这个问题,但是对于这个问题我会稍微改变一下。
很遗憾,没有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();
}
太容易了。
答案 2 :(得分:5)
截至今天,此功能尚无支持。但是,我发现了这个问题。
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.
//
}
答案 3 :(得分:1)
一个简单的解决方案可能是将drawable id存储在临时变量中。我不确定这对你的情况有多实用,但它肯定是一个快速修复。
答案 4 :(得分:1)
挖掘StackOverflow以寻找类似问题的答案,我发现人们通常建议采用两种方法:
就个人而言,我喜欢第二种出于性能原因的方法,但使用适当的标签标记一堆视图既痛苦又耗时。这在一个大项目中可能非常令人沮丧。在我的情况下,我需要编写很多Espresso测试,这些测试需要比较TextView
drawables,ImageView
资源,View
背景和前景。很多工作。
所以我最终提出了一个解决方案,将“脏”工作委托给自定义的inflater。在每个膨胀的视图中,我搜索特定属性,并使用资源ID(如果找到)为视图设置标记。这种方法几乎和Calligraphy使用的那些人一样。我为此写了一个简单的库: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上的Custom attributes部分。 如果在运行时设置drawable,则可以使用方便的库方法:
setImageViewResource(ImageView view, int id)
在这种情况下,标记是在内部完成的。如果您使用Kotlin,您可以编写一个方便的扩展来调用视图本身。像这样:
fun ImageView.setImageResourceWithTag(@DrawableRes int id) {
TagViewUtils.setImageViewResource(this, id)
}
中找到其他信息
答案 5 :(得分:0)
更简单:只需将R.drawable
ID存储在视图的ID中:使用v.setId()
。然后使用v.getId()
将其恢复。
答案 6 :(得分:0)
我最近遇到了同样的问题。我通过实现自己的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
}
}