以编程方式访问res/raw的内容(Android)

pab*_*ier 13 java android

我正在与其他几个人一起开发Android应用程序,主要内容由我们的设计师指定为特定文件格式的文本文件,然后我们在应用程序中解析,处理和提供.我们目前正在存储它们res/raw.

这对设计师来说非常有用,因为当他们想要添加内容时,他们只需添加一个文件res/raw.然而,作为开发人员,这很烦人,因为我们开发人员需要R.raw.the_new_file在代码中添加一个数组,指定在启动时要处理哪些文件.

有没有办法以res/raw编程方式访问资源ID ?理想情况下,当应用程序启动时,我们可以调用以查看哪些文件存在res/raw,处理所有这些文件,因此我们可以通过res/raw在代码中匹配数组的内容来消除小的开销 .

我见过的最有希望的路径是getAssets资源,这将让我叫list(String)AssetManager,但我有麻烦这项工作,特别是因为你不能直接调用"res/raw"为您的文件路径(或至少,它不是招我试过的时候工作了.

Pad*_*dde 17

你可以使用反射.


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) { }
Run Code Online (Sandbox Code Playgroud)

在该列表中保存res/raw文件夹中的所有资源ID.如果您需要资源的名称... f.getName()将返回它.


ove*_*tic 6

这个答案可能有点晚,你应该使用assets文件夹.在那里,您可以拥有文件夹层次结构并将其作为文件系统读取.

对于您的信息,getAssets返回Android项目"assets"文件夹中的文件管理器,而不是"res/raw"."res/raw"进入"R"Java包.assets.list(path)返回给定文件夹中相对于assets文件夹的文件数组.资产的文件夹也不是传统的文件夹,但Android将其抽象化,使其"感觉"像普通文件一样.如果您正在进行JNI并希望从c/c ++中读取资产,这就变得更加重要.