在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目录中。
答案 0 :(得分:505)
不,资源机制不支持drawable目录中的子文件夹,所以是的 - 您需要保持该层次结构不变。
您显示的目录布局将导致所有图像都不可用。
根据我自己的实验,似乎在res/drawable
文件夹中包含其中包含任何项目的子文件夹将导致资源编译器失败 - 阻止正确生成R.java
文件。
答案 1 :(得分:147)
我使用的解决方法(以及一个Android本身似乎更喜欢)基本上用下划线代替正斜杠,所以你的结构看起来像这样:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
这种方法要求你在命名方面要细致,并且不要让文件本身更容易纠缠(如果你认为饮料和三明治应该真的都是" food
& #34;,你必须进行大规模重命名,而不是简单地将它们移动到目录中);但是,与等效的文件夹结构相比,你的编程逻辑的复杂性并没有太差。
这种情况确实很糟糕。 Android是一系列精彩而可怕的设计决策。我们只能希望后一部分能够得到彻底的淘汰:)
答案 2 :(得分:33)
是的 - 确实很糟糕:)但是你可以使用assets文件夹并在那里有子目录并以这种方式加载图像。
答案 3 :(得分:32)
答案 4 :(得分:22)
使用资产文件夹。
示例代码:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
答案 5 :(得分:20)
我写了一个eclipse插件,它允许通过用两个下划线__
分隔文件名来创建虚拟子文件夹。该项目处于早期阶段,但不要担心它会让您的IDE崩溃
可在此处找到更多详细信息,随意分叉并发送拉取请求:
https://github.com/kirill578/Android-Sorted-Res-Folder
答案 6 :(得分:9)
我喜欢使用一个简单的脚本来展平设计师提供的有组织的目录结构,以便用于生成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
答案 7 :(得分:9)
在带有gradle的android studio中,您可以拥有多个源导向器,可以让您分离资源。例如:
android {
....
android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
但名称不得碰撞,这意味着您仍然需要使用诸如sandwiches_tunaOnRye之类的名称,但是您可以为所有三明治分配一个单独的部分。
这允许您将资源存储在不同的结构中(对于自动生成的内容很有用,例如actionbargenerator)
答案 8 :(得分:4)
部分解决问题的一种方法是使用API级别后缀。 我使用res / layout-v1,res / layout-v2等来在同一个apk中保存多个子项目。 此机制可用于所有资源类型。
显然,只有当你的目标API水平高于res / layout-v时,才能使用此功能?你正在使用。
另外,请注意Android 1.5和1.6中的错误。 See Andoroid documentation about the API Level suffix
答案 9 :(得分:3)
随着图书馆系统的出现,每个大型资产创建一个库可能是一个解决方案。
仍然存在问题,因为必须避免在所有资产中使用相同的名称,但每个库使用前缀方案应该有助于此。
它不像创建文件夹那么简单,但这有助于保持理智......
答案 10 :(得分:2)
这种情况有一种解决方法:您可以在与默认resVector
文件夹相同的级别创建res
(例如)文件夹。在那里,您可以在那里添加任何drawable-xxx
资源文件夹:
resVector
-drawable
-layout
-color
之后,您只需要添加
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
进入build.gradle
文件(android { }
内)。
答案 11 :(得分:1)
不是我的,但是在寻找这个问题时我找到了这个帖子,如果你使用Android Studio和Gradle Build系统很简单,那么只需要一点点构建文件编辑就不需要插件
答案 12 :(得分:1)
在main中创建一个文件夹。 喜欢:' res_notification_btn'
并在。中创建树文件夹,例如' drawable'或者'布局'
然后在' build.gradle'添加这个
sourceSets
{
main
{
res
{
srcDirs = ['src/main/res_notification_btn', 'src/main/res']
or
srcDir 'src/main/res_notification_btn'
}
}
}
答案 13 :(得分:1)
Gradle with Android Studio可以这样做(link)。
它在段落"配置结构"
中sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
答案 14 :(得分:1)
这不是完美的方法。您必须实现与显示here相同的方式。
您也可以通过可以使用的代码调用文件夹下的图像
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
答案 15 :(得分:0)
资产/ 您可以使用它来存储原始资产文件。您在此处保存的文件将按原样编译为.apk文件,并保留原始文件名。您可以使用URI以与典型文件系统相同的方式导航此目录,并使用AssetManager将文件作为字节流读取。例如,这是纹理和游戏数据的良好位置。 http://developer.android.com/tools/projects/index.html
答案 16 :(得分:0)
检查将文件夹层次结构转换为单个文件夹的Bash Flatten Folder script
答案 17 :(得分:0)
不允许使用子目录,资源必须只包含[a-z0-9 _。]。
不,你有大写字母,没有正斜杠。
答案 18 :(得分:0)
#!/usr/bin/env ruby
# current dir should be drawable-hdpi/ etc
# nuke all symlinks
Dir.foreach('.') {|f|
File.delete(f) if File.symlink?(f)
}
# symlink all resources renaming with underscores
Dir.glob("**/*.png") {|f|
system "ln -s #{f} #{f.gsub('/', '_')}" if f.include?("/")
}
答案 19 :(得分:0)
通过具有一个与子文件夹“ drawable”平行的“ res”文件夹,然后在gradle中添加以下内容,可以有多个可绘制文件夹:
sourceSets {
main {
res.srcDirs 'src/main/<extra_res>'
}
}
经过gradle 6.5.1测试
答案 20 :(得分:-2)