2009-07-03 157 views
411

在Android SDK文档中,所有与@ drawable/my_image xml语法一起使用的示例直接处理存储在我的项目的res/drawable目录中的图像。Android可绘制目录是否可以包含子目录?

我想知道是否明确不可以在drawable目录下创建一个子目录。

举例来说,如果我有以下的目录布局:

res/drawable 
-- sandwiches 
    -- tunaOnRye.png 
    -- hamAndSwiss.png 
-- drinks 
    -- coldOne.png 
    -- hotTea.png 

我能引用金枪鱼沙拉三明治的图像作为@绘制/三明治/ tunaOnRye

还是我必须保持可绘制目录中的层次平坦。

+14

请注意,res目录中不允许有大写字母。 – Tyler 2012-01-11 01:34:38

+1

你只能用Gradle来做到这一点: http://stackoverflow.com/a/19859379 – 2014-04-07 08:13:57

+2

是否有可能有** SIBLING **目录绘制,具有可绘制的功能?那么,res /坦克/ drawble- [hdpi .. etc]等等? – Fattie 2014-05-23 08:45:28

回答

462

不,资源机制不支持可绘制目录中的子文件夹,所以是的 - 您需要保持该层次结构不变。

您显示的目录布局将导致没有可用的图像。

从我自己的实验中看来,在res/drawable文件夹中有一个包含任何项目的子文件夹将导致资源编译器失败 - 防止正确生成R.java文件。

+115

从Android 2.2开始,这不会导致编译器错误,但生成R类时将忽略任何子目录。这真的很糟糕,并且很难管理更大的项目。 =/ – 2010-07-28 08:42:39

+56

完全同意。他们需要提出一个更好的解决方案来支持子文件夹。它不是那么难。 – znq 2010-09-06 17:22:11

+13

希望这将很快得到解决,我有超过100个资产,即使这样我编码了一些。试图管理任何勉强复杂的项目的全夜母马。 – Emile 2011-01-06 16:40:05

30

是的 - 它确实吸吮:)但是,您可以使用资产文件夹,并在那里有子目录,并以这种方式加载图像。

4

部分解决问题的一种方法是使用API​​级别后缀。 我使用res/layout-v1,res/layout-v2等来在同一个apk中保存多个子项目。 该机制可用于所有资源类型。

很明显,只有在res/layout-v之上的API级别定位时才能使用它。您正在使用。

另外,请注意Android 1.5和1.6中的错误。 See Andoroid documentation about the API Level suffix

135

我使用(和一个Android的本身似乎有利于)是基本上代替下划线的斜杠,所以你的结构将看起来像这样的解决方法:

sandwich_tunaOnRye.png 
sandwich_hamAndSwiss.png 
drink_coldOne.png 
drink_hotTea.png 

该方法需要你的命名很细致,并不会让文件本身变得简单(如果你认为饮料和三明治应该都是“food”),你必须进行批量重命名而不是简单地移动它们到目录);但是与相当的文件夹结构相比,编程逻辑的复杂性也不会受到的太多的影响。

这种情况真的很糟糕。 Android是精彩和糟糕的设计决策的混合包。我们只希望后一部分能够全部赶快被淘汰出局:)

22

使用资产文件夹。

示例代码:

InputStream is = null; 
try { 
    is = this.getResources().getAssets().open("test/sample.png"); 
} catch (IOException e) { 
    ; 
} 

image = BitmapFactory.decodeStream(is); 
9

我喜欢用一个简单的脚本来平由设计者提供的东西,可以用来生成一个R档有组织的目录结构。

运行与绘制,华电国际目前的路径:

#! /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 
2

随着图书馆系统的问世,创造每大集资源的库可能是一个解决方案。

它仍然有问题,因为必须避免在所有资产中使用相同的名称,但使用每个库的前缀方案应该有所帮助。

这并不是因为能够创建文件夹一样简单,但是可以帮助保持理智的事情...

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?("/") 
} 
1

这是不完美的方法。您必须执行相同的显示方式here

您也可以通过拨打该代码的文件夹下的图片,你可以使用

Resources res = getResources(); 
Drawable shape = res. getDrawable(R.drawable.gradient_box); 

TextView tv = (TextView)findViewByID(R.id.textview); 
tv.setBackground(shape); 
20

我已经写了一个Eclipse插件,它允许用两个下划线__分离的文件名来创建虚拟子文件夹。该项目正处于早期阶段,但不用担心它会不会崩溃您的IDE

更多的细节可以在这里找到,随时到餐桌和派拉请求:

https://github.com/kirill578/Android-Sorted-Res-Folder

enter image description here

0

资产/ 你可以用它来存储原始资源文件。这里保存的文件按原样编译为.apk文件,并保留原始文件名。您可以像使用URI的典型文件系统一样导航此目录,并使用AssetManager将文件作为字节流读取。例如,这对于纹理和游戏数据来说是一个很好的位置。 http://developer.android.com/tools/projects/index.html

8

在Android Gradle工作室中,您可以拥有多个源代码导向器,它们将允许您分开资源。例如:

android { 
    .... 
    android.sourceSets { 
     main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res'] 
    } 
    .... 
} 

但是,名称不能冲突,这意味着你将仍然需要有名称,如sandwiches_tunaOnRye但你将能够对所有的三明治的一个单独部分。

这可以让你的资源(生成的内容自动有用如actionbargenerator)存储在不同的结构

1

摇篮与Android工作室能做到这样(link)。

这是段落中的“配置结构”

sourceSets { 
main { 
    java { 
     srcDir 'src/java' 
    } 
    resources { 
     srcDir 'src/resources' 
    } 
} 
} 
24

事实上,在Android工作室它是可能的。您可以嵌套资源如图所示here

enter image description here

还有一个插件组资源here

0

子目录是不允许的,资源只能包含[a-z0-9_。]。

不,你有大写字母,没有正斜杠。

1

在main中创建一个文件夹。 像:“res_notification_btn”

和创建文件夹树像“绘制”或“布局”

然后在“的build.gradle”添加此

sourceSets 
      { 
       main 
       { 
        res 
        { 
         srcDirs = ['src/main/res_notification_btn', 'src/main/res'] 
         or 
         srcDir 'src/main/res_notification_btn' 
        } 
       } 
      } 
2

有一个办法解决这个情况:您可以在与默认res文件夹相同的级别上创建一个resVector(例如)文件夹。在那里,你可以添加任何drawable-xxx资源文件夹有:

resVector 
-drawable 
-layout 
-color 

后,所有你需要的是增加

sourceSets { 
     main.res.srcDirs += 'src/main/resVector' 
    } 

到您的build.gradle文件(里面android { })。

相关问题