Дополнение содержимого res/raw программно (Android)

Я работаю над приложением для Android с несколькими другими людьми, а основной контент определяется нашими дизайнерами как текстовые файлы в определенном формате файлов, которые мы затем анализируем, обрабатываем и обслуживаем в приложении. В настоящее время мы сохраняем их в res/raw.

Это отлично подходит для дизайнеров, потому что, когда они хотят добавить контент, они просто добавляют файл к res/raw. Это раздражает как разработчик, однако, поскольку разработчикам необходимо добавить R.raw.the_new_file в массив в коде, определяющем, какие файлы обрабатывать при запуске.

Есть ли способ получить доступ к идентификатору ресурса res/raw программно? В идеале, когда приложение запускается, мы можем сделать вызов, чтобы посмотреть, какие файлы находятся в res/raw, обработать все из них, чтобы мы могли устранить небольшие накладные расходы, сопоставив содержимое res/raw с содержимым нашего массива в коде.

Самый многообещающий путь, который я видел, - getAssets из Resources, что позволит мне называть list(String) на AssetManager, но мне не удалось заставить это работать, тем более, что вы не можете напрямую вызвать "res/raw" как ваш путь к файлу (или, по крайней мере, он не сработал, когда я попытался.

Предложения? Благодаря

Ответ 1

Вы можете использовать отражение.


ArrayList<Integer> list = new ArrayList<Integer>();
Field[] fields = R.raw.class.getFields();
for(Field f : fields)
try {
        list.add(f.getInt(null));
    } catch (IllegalArgumentException e) {
    } catch (IllegalAccessException e) { }

После этого списка хранятся все идентификаторы ресурсов в папке res/raw. Если вам нужно имя ресурса... f.getName() возвращает его.

Ответ 2

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

Для вашей информации getAssets возвращает менеджера для файлов в папке "активы" вашего проекта Android, а не в "res/сырой". "res/raw" переходит в пакет Java "R". assets.list(путь) Возвращает массив файлов в данной папке относительно вашей папки с ресурсами. Папка активов также не является традиционной папкой, но Android аннотирует ее так, что она "чувствует", как обычные файлы. Это становится более важным, если вы делаете JNI и хотите читать свои активы из c/С++.

Ответ 3

Вы можете использовать

Context.getResources().getIdentifier("filename", "raw", "packagename");

чтобы получить соответствующий идентификатор. однако я не понимаю, почему вы реализуете свое решение, которое сложно? Каковы преимущества для дизайнера? почему они не просто помещают файлы в выпадающую папку?