Дополнение содержимого 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");
чтобы получить соответствующий идентификатор. однако я не понимаю, почему вы реализуете свое решение, которое сложно? Каковы преимущества для дизайнера? почему они не просто помещают файлы в выпадающую папку?