Android drawable目录可以包含子目录吗?

时间:2009-07-03 00:30:08

标签: 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

我可以参考金枪鱼沙拉三明治的图像@ drawable / sandwiches / tunaOnRye

或者我必须将层次结构保持在drawable目录中。

21 个答案:

答案 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)

实际上,在Android Studio上它是可能的。您可以拥有嵌套资源,如here所示:

enter image description here

还有一个用于对资源here进行分组的插件。

答案 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

enter image description here

答案 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系统很简单,那么只需要一点点构建文件编辑就不需要插件

https://stackoverflow.com/a/22426467/618419

答案 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)

  1. 右键单击Drawable
  2. 选择新建--->目录
  3. 输入目录名称。例如:logo.png(默认情况下,该位置已经显示了drawable文件夹)
  4. 将图像直接复制并粘贴到可绘制文件夹中。粘贴时,您可以从列表中为每个图像选择mdpi / xhdpi / xxhdpi等。选择适当的选项,然后输入图像的名称。确保与目录名称保持相同的名称,即logo.png
  5. 对其余图像执行相同的操作。所有这些都将放置在logo.png主文件夹下。