Pep*_*obe 471 android drawable android-resources
在Android SDK文档中,与@ drawable/my_image xml语法一起使用的所有示例都直接处理存储在项目的res/drawable目录中的图像.
我想知道在drawable目录中创建子目录是否明确不可行.
例如,如果我有以下目录布局:
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
Run Code Online (Sandbox Code Playgroud)
我可以参考金枪鱼沙拉三明治的图像@ drawable/sandwiches/tunaOnRye
或者我必须将层次结构保持在drawable目录中.
Ret*_*ier 522
不,资源机制不支持drawable目录中的子文件夹,所以是 - 您需要保持该层次结构平坦.
您显示的目录布局将导致没有可用的图像.
根据我自己的实验,似乎在文件夹中有一个包含任何项目的子res/drawable文件夹,将导致资源编译器失败 - 阻止R.java文件正确生成.
Che*_*ter 147
我正在使用的解决方法(以及Android本身似乎更喜欢)是基本上用下划线代替正斜杠,所以你的结构看起来像这样:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
Run Code Online (Sandbox Code Playgroud)
这种方法要求你在命名方面一丝不苟,并且不要让文件本身更容易纠缠(如果你认为饮料和三明治应该都是" food",你必须进行大规模重命名,而不是简单地将它们移动到目录); 但是,与文件夹结构相比,你的编程逻辑的复杂性不会太糟糕.
这种情况确实很糟糕.Android是一系列精彩而可怕的设计决策.我们只能希望后一部分得到彻底清除所有应有的急速:)
dij*_*iji 34
是的 - 确实很糟糕:)但是你可以使用assets文件夹并在那里有子目录并以这种方式加载图像.
小智 23
使用assets文件夹.
示例代码:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
Run Code Online (Sandbox Code Playgroud)
Kir*_*kov 20
我写了一个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
Run Code Online (Sandbox Code Playgroud)
在带有gradle的android studio中,您可以拥有多个源控制器,这将允许您分离资源.例如:
android {
....
android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
Run Code Online (Sandbox Code Playgroud)
但是名字一定不能碰撞,这意味着你仍然需要有像sandwiches_tunaOnRye这样的名字,但是你可以为你所有的三明治分开一个单独的部分.
这允许您将资源存储在不同的结构中(对于自动生成的内容很有用,例如actionbargenerator)
部分解决该问题的一种方法是使用 API 级别后缀。我使用 res/layout-v1、res/layout-v2 等在同一个 apk 中保存多个子项目。该机制可用于所有资源类型。
显然,只有当您的目标 API 级别高于 res/layout-v 时才可以使用此方法?您正在使用。
另外,请注意 Android 1.5 和 1.6 中的错误。 请参阅有关 API 级别后缀的 Android 文档。
对于这种情况有一个解决方法:您可以resVector在与默认文件夹相同的级别创建(例如)文件夹res。您可以在那里添加任何drawable-xxx资源文件夹:
resVector
-drawable
-layout
-color
Run Code Online (Sandbox Code Playgroud)
之后你需要做的就是添加
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
Run Code Online (Sandbox Code Playgroud)
进入你的build.gradle文件(内部android { })。