在Android SDK文档中,与@ drawable/my_image xml语法一起使用的所有示例都直接处理存储在项目的res/drawable目录中的图像.
我想知道在drawable目录中创建子目录是否明确不可行.
例如,如果我有以下目录布局:
res/drawable -- sandwiches -- tunaOnRye.png -- hamAndSwiss.png -- drinks -- coldOne.png -- hotTea.png
我可以参考金枪鱼沙拉三明治的图像@ drawable/sandwiches/tunaOnRye
或者我必须将层次结构保持在drawable目录中.
不,资源机制不支持drawable目录中的子文件夹,所以是 - 您需要保持该层次结构平坦.
您显示的目录布局将导致没有可用的图像.
根据我自己的实验,似乎在文件夹中有一个包含任何项目的子res/drawable
文件夹,将导致资源编译器失败 - 阻止R.java
文件正确生成.
我正在使用的解决方法(以及Android本身似乎更喜欢)是基本上用下划线代替正斜杠,所以你的结构看起来像这样:
sandwich_tunaOnRye.png sandwich_hamAndSwiss.png drink_coldOne.png drink_hotTea.png
这种方法要求你在命名方面一丝不苟,并且不要让文件本身更容易纠缠(如果你认为饮料和三明治应该都是" food
",你必须进行大规模重命名,而不是简单地将它们移动到目录); 但是,与文件夹结构相比,你的编程逻辑的复杂性不会太糟糕.
这种情况确实很糟糕.Android是一系列精彩而可怕的设计决策.我们只能希望后一部分得到彻底清除所有应有的急速:)
是的 - 确实很糟糕:)但是你可以使用assets文件夹并在那里有子目录并以这种方式加载图像.
实际上,在Android Studio上它是可能的.您可以嵌套资源如图所示在这里:
还有一个插件可以在这里分组资源.
使用assets文件夹.
示例代码:
InputStream is = null; try { is = this.getResources().getAssets().open("test/sample.png"); } catch (IOException e) { ; } image = BitmapFactory.decodeStream(is);
我写了一个eclipse插件,它允许通过用两个下划线分隔文件名来创建虚拟子文件夹__
.该项目处于早期阶段,但不要担心它不会导致IDE崩溃
更多细节可以在这里找到,随意分叉和发送拉取请求:
https://github.com/kirill578/Android-Sorted-Res-Folder
我喜欢使用一个简单的脚本来将设计者提供的有组织的目录结构展平为可以用来生成R文件的东西.
在drawable-hdpi中使用当前路径运行:
#! /bin/bash DIRS=`find * -type d` for dir in ${DIRS} ; do for file in `ls ${dir}` ; do mv ${dir}/${file} ${dir}_${file}; done rmdir ${dir}; done
在带有gradle的android studio中,您可以拥有多个源控制器,这将允许您分离资源.例如:
android { .... android.sourceSets { main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res'] } .... }
但是名字一定不能碰撞,这意味着你仍然需要有像sandwiches_tunaOnRye这样的名字,但是你可以为你所有的三明治分开一个单独的部分.
这允许您将资源存储在不同的结构中(对于自动生成的内容很有用,例如actionbargenerator)