在查找类似问题的答案时,我在StackOverflow上发现人们通常建议两种方法:
- 将可绘制对象加载到内存中,并将ConstantState或位图本身与其他对象进行比较。
- 将具有可绘制对象ID的标签设置到视图中,并在需要时比较标签。
就个人而言,出于性能原因,我更喜欢第二种方法,但是使用适当的标签标记大量视图很繁琐且耗时。在大型项目中,这可能非常令人沮丧。在我的情况下,我需要编写许多Espresso测试,这些测试需要比较
TextView
可绘制对象、
ImageView
资源、
View
背景和前景。这是一项艰巨的工作。
所以,我最终想出了一种解决方案,将“脏”工作委托给自定义的布局填充器。在每个充气的视图中,我搜索特定的属性,并在找到任何资源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上的
自定义属性部分即可。如果您在运行时设置了可绘制对象,则可以使用方便的库方法:
setImageViewResource(ImageView view, int id)
在这种情况下,标记是在内部为您完成的。如果您使用 Kotlin,您可以编写一个便捷的扩展来调用视图本身。类似于这样的东西:
fun ImageView.setImageResourceWithTag(@DrawableRes int id) {
TagViewUtils.setImageViewResource(this, id)
}
您可以在
运行时标记中找到更多信息。