Копание StackOverflow для получения ответов на аналогичную проблему. Я нашел людей, обычно предлагающих 2 подхода:
- Загрузите в память отрисовку и сравните ConstantState или сам растр с другим.1006 *
- Установите тег с отображаемым идентификатором в представление и сравните теги, когда вам это нужно.
Лично мне нравится второй подход по соображениям производительности, но пометка группы представлений соответствующими тегамибольно и отнимает много времени.Это может быть очень сложно в большом проекте.В моем случае мне нужно написать множество тестов для эспрессо, которые требуют сравнения TextView
ресурсов рисования, ImageView
ресурсов, View
фона и переднего плана.Много работы.
Так что в итоге я пришел к решению, чтобы делегировать «грязную» работу пользовательскому инфлятору.В каждом завышенном представлении я выполняю поиск определенных атрибутов и устанавливаю тег для представления с идентификатором ресурса, если таковой найден.Этот подход в значительной степени используется теми же парнями из Каллиграфия .Я написал для этого простую библиотеку: TagView
Если вы используете ее, вы можете извлечь любой из предопределенных тегов, содержащих идентификатор нарисованного ресурса, который был установлен в файле макета xml:
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, вы можете написать удобные расширения для вызова view.Примерно так:
fun ImageView.setImageResourceWithTag(@DrawableRes int id) {
TagViewUtils.setImageViewResource(this, id)
}
Дополнительную информацию можно найти в Пометка во время выполнения