Доступ к содержимому res / raw программно (Android) - PullRequest
13 голосов
/ 10 мая 2010

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

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

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

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

Ответы [ 3 ]

17 голосов
/ 10 мая 2010

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


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 () возвращает его.

6 голосов
/ 09 января 2012

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

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

1 голос
/ 10 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...