Получение ID ресурса из строки в Android: решения
Быстрый ответ
Для получения идентификатора ресурса в Android следует использовать метод getIdentifier()
, принадлежащий классу Resources
:
int resId = context.getResources().getIdentifier("name", "type", context.getPackageName());
Под "name"
следует разуметь название ресурса, а под "type"
– его тип (например, "drawable"
, "layout"
, "string"
). Таким образом, вы сможете использовать resId
для доступа к ресурсу в коде.
Обращаем ваше внимание на то, что имена полей ресурсов преобразуют точки (.) в подчёркивания (_).
Почему стоит избегать использования рефлексии?
Хотя использование рефлексии может быть более быстрым, чем метод getIdentifier()
, оно обусловливает большую сложность применения:
Field field = R.drawable.class.getField("resourceName");
int resourceId = field.getInt(null);
Хотите сравнить производительность этих вариантов? Ознакомьтесь с блогом Даниэля Лью, в котором дана развернутая информация по данной теме.
Остерегайтесь сокращения кода!
Инструменты сборки такие, как ProGuard или R8, могут удалить неиспользуемые ресурсы посредством сокращения кода. Для сохранения ресурсов добавьте следующие строки в конфигурацию ProGuard:
-keepclassmembers class **.R$* {
public static <fields>;
}
Таким образом, вы обезопасите ресурсные записи от удаления.
Необходима повышенная скорость? Задействуйте кэш.
Для увеличения скорости повторных запросов ресурсов можно употребить карту HashMap как кэш:
static Map<String, Integer> resourceCache = new HashMap<>();
public static int getResId(String resName, Class<?> c) {
if (!resourceCache.containsKey(resName)) {
try {
Field field = c.getDeclaredField(resName);
resourceCache.put(resName, field.getInt(null));
} catch (Exception e) {
return -1;
}
}
return resourceCache.get(resName);
}
Это значительно ускорит поиск ресурсов.
Визуализация
Получение идентификатора ресурса в Android можно сравнить с поиском конкретной книги в библиотеке. Каждый ресурс – это своего рода книга с уникальным идентификационным кодом:
Библиотечный каталог (📚):
- "the_great_escape" 🔍 -> 📖 ID: 12345
- "android_adventures" 🔍 -> 📖 ID: 67890
- "resourceful_journey" 🔍 -> 📖 ID: 11223
Также, как в каталоге по названию книги ищется ее уникальный код, так вы можете найти идентификатор ресурса, используя его имя:
int resId = getResources().getIdentifier("the_great_escape", "drawable", getPackageName());
// Это всё равно что спросить у библиотекаря: "Не подскажете ID для 'the_great_escape'?"
Папка ресурсов вашего приложения – это ваша библиотека, названия книг – это имена ресурсов, которые вы ищете.
🔍: Поиск по названию -> 📖: Получение ID ресурса
// Сочетание строки с идентификатором ресурса осуществляется при помощи `getIdentifier`, в чем можно увидеть аналогию с тем, как Уолли сортирует мусор.
Здесь лежат драконы: Обработка исключений
Не забудьте проверить доступность ресурса, чтобы предотвратить ошибки при его отсутствии:
if (resId == 0) {
// Если ресурс не найден, возвращается 0.
}
Если getIdentifier()
вернет 0
, то нужный вам ресурс отсутствует.
Не путает ли вас название пакета?
Для корректной работы метода getIdentifier()
необходимо использовать точное название пакета. Неверное название пакета приведёт к тому, что ресурс не будет найден.
Перечислите все идентификаторы!
Перечисления (enums) облегчают сопоставление имен ресурсов с их идентификаторами. Это способствует усилению безопасности типов и предотвращает ошибки во время выполнения.
Полезные материалы
- Обзор ресурсов приложений | Разработчики Android — здесь вы найдете полную информацию о управлении ресурсами Android.
- java – Получение идентификатора ресурса из строки в Android? – Stack Overflow — на Stack Overflow обсуждаются различные способы решения данной задачи.
- Блог разработчиков Android — последние обновления и советы от команды разработчиков Android.
- Домашняя страница · руководства Codepath по Android · GitHub — глубочайшее руководство по разработке для Android.
- Medium — статья Medium с важной информацией о ресурсах Android.
- Учебник | DigitalOcean — подробный учебник по лучшим практикам использования ресурсов Android.
- Организация и доступ к ресурсам Android — всестороннее руководство от Tutorialspoint по организации и доступу к ресурсам Android.