Большое количество изображений для ссылки, не хочу жестко кодировать поддержку для каждого изображения

#android

#Android

Вопрос:

У меня есть около 650 маленьких значков, на которые мне нужно ссылаться в моем проекте Android. Общий размер всех из них составляет около 70 кб, поэтому размер не является проблемой.

Приложение, которое я создаю, просто перечисляет все 650 этих значков вместе с меткой для каждого. Метки хранятся в массиве строк, и каждый из этих значков имеет индекс labels в имени файла для удобства ссылки (таким образом, индекс 0 в массиве labels совпадает с файлом p0.png в папке drawable моего проекта Android).

Это работает нормально, но проблема в том, что я могу ссылаться на эти изображения, не используя R.class. Класс R устанавливает переменные и все такое, но ссылаться на изображения через класс R чертовски сложно, когда я могу просто перебирать их и использовать имена их файлов в качестве индексов.

Есть ли способ получить доступ к этим изображениям без использования R.class ? Я бы также хотел избежать использования SD-карты для этого, так как эти изображения будут довольно раздражающими при просмотре на SD-карте.

Предложения?

Комментарии:

1. В качестве подсказки вы можете использовать SD-карту; просто поместите файл с именем .NOMEDIA в каталог, и сканер мультимедиа не будет индексировать эту папку.

Ответ №1:

Поместите значки в /assets каталог и используйте AssetManager для доступа к ним. Ресурсы в assets каталоге не будут проиндексированы в R-файле.

Ответ №2:

Подход с использованием ресурсов, безусловно, сработает, но имеет тот недостаток, что вы не можете разделить свои изображения по отдельным папкам. Использование предоставленной функции позволит вам выполнять итерации по вашему списку, который можно отображать, передавая ваш индекс в виде строкового значения.

 public int getId(String name) {
        Class<R.drawable> class = R.drawable.class;
        Field field;
        int i = 0;
        try {
            field = class.getField(name);
            i = field.getInt(field);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  i;
    }
  

Редактировать

Приношу извинения за ответ на принятый вопрос, принятый в момент публикации.