logo

Получение ID ресурса из строки в Android: решения

Быстрый ответ

Для получения идентификатора ресурса в Android следует использовать метод getIdentifier(), принадлежащий классу Resources:

Java
Скопировать код
int resId = context.getResources().getIdentifier("name", "type", context.getPackageName());

Под "name" следует разуметь название ресурса, а под "type" – его тип (например, "drawable", "layout", "string"). Таким образом, вы сможете использовать resId для доступа к ресурсу в коде.

Обращаем ваше внимание на то, что имена полей ресурсов преобразуют точки (.) в подчёркивания (_).

Почему стоит избегать использования рефлексии?

Хотя использование рефлексии может быть более быстрым, чем метод getIdentifier(), оно обусловливает большую сложность применения:

Java
Скопировать код
Field field = R.drawable.class.getField("resourceName");
int resourceId = field.getInt(null);

Хотите сравнить производительность этих вариантов? Ознакомьтесь с блогом Даниэля Лью, в котором дана развернутая информация по данной теме.

Остерегайтесь сокращения кода!

Инструменты сборки такие, как ProGuard или R8, могут удалить неиспользуемые ресурсы посредством сокращения кода. Для сохранения ресурсов добавьте следующие строки в конфигурацию ProGuard:

proguard
Скопировать код
-keepclassmembers class **.R$* {
    public static <fields>;
}

Таким образом, вы обезопасите ресурсные записи от удаления.

Необходима повышенная скорость? Задействуйте кэш.

Для увеличения скорости повторных запросов ресурсов можно употребить карту HashMap как кэш:

Java
Скопировать код
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 можно сравнить с поиском конкретной книги в библиотеке. Каждый ресурс – это своего рода книга с уникальным идентификационным кодом:

Markdown
Скопировать код
Библиотечный каталог (📚): 
- "the_great_escape"     🔍 -> 📖 ID: 12345
- "android_adventures"   🔍 -> 📖 ID: 67890
- "resourceful_journey"  🔍 -> 📖 ID: 11223

Также, как в каталоге по названию книги ищется ее уникальный код, так вы можете найти идентификатор ресурса, используя его имя:

Java
Скопировать код
int resId = getResources().getIdentifier("the_great_escape", "drawable", getPackageName());
// Это всё равно что спросить у библиотекаря: "Не подскажете ID для 'the_great_escape'?"

Папка ресурсов вашего приложения – это ваша библиотека, названия книг – это имена ресурсов, которые вы ищете.

Markdown
Скопировать код
🔍: Поиск по названию -> 📖: Получение ID ресурса
// Сочетание строки с идентификатором ресурса осуществляется при помощи `getIdentifier`, в чем можно увидеть аналогию с тем, как Уолли сортирует мусор.

Здесь лежат драконы: Обработка исключений

Не забудьте проверить доступность ресурса, чтобы предотвратить ошибки при его отсутствии:

Java
Скопировать код
if (resId == 0) {
    // Если ресурс не найден, возвращается 0.
}

Если getIdentifier() вернет 0, то нужный вам ресурс отсутствует.

Не путает ли вас название пакета?

Для корректной работы метода getIdentifier() необходимо использовать точное название пакета. Неверное название пакета приведёт к тому, что ресурс не будет найден.

Перечислите все идентификаторы!

Перечисления (enums) облегчают сопоставление имен ресурсов с их идентификаторами. Это способствует усилению безопасности типов и предотвращает ошибки во время выполнения.

Полезные материалы

  1. Обзор ресурсов приложений | Разработчики Android — здесь вы найдете полную информацию о управлении ресурсами Android.
  2. java – Получение идентификатора ресурса из строки в Android? – Stack Overflow — на Stack Overflow обсуждаются различные способы решения данной задачи.
  3. Блог разработчиков Android — последние обновления и советы от команды разработчиков Android.
  4. Домашняя страница · руководства Codepath по Android · GitHub — глубочайшее руководство по разработке для Android.
  5. Medium — статья Medium с важной информацией о ресурсах Android.
  6. Учебник | DigitalOcean — подробный учебник по лучшим практикам использования ресурсов Android.
  7. Организация и доступ к ресурсам Android — всестороннее руководство от Tutorialspoint по организации и доступу к ресурсам Android.