我想知道是否明确不允许在drawable目录中创建子目录。
例如,如果我有以下目录布局:
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
我能用 @drawable/sandwiches/tunaOnRye 引用一张金枪鱼沙拉三明治的图片吗?
或者说,我必须在 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文件夹,并在其中拥有子目录,以此方式加载图像。
使用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
在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
android {
....
android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
部分解决该问题的方法是使用API级别后缀。我使用res/layout-v1、res/layout-v2等来在同一个apk中容纳多个子项目。这种机制可用于所有资源类型。
显然,只有当您的目标API级别高于您正在使用的res/layout-v?时才能使用此功能。
此外,请注意Android 1.5和1.6中的错误。请参阅Android文档中关于API级别后缀的内容。
对于这种情况,有一个解决方法:您可以在与默认res
文件夹相同的级别上创建一个名为resVector
(例如)的文件夹。在那里,您可以添加任何drawable-xxx
资源文件夹:
resVector
-drawable
-layout
-color
标签相对应,用于结束段落。
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
build.gradle
文件中(在 android { }
内部):