Android可绘制目录是否可以包含子目录?
在Android SDK文档中,与@ drawable / my_image xml语法一起使用的所有示例直接处理存储在我的项目的res / drawable目录中的图像。
我想知道是否明确不能在绘制目录中创建一个子目录。
例如,如果我有以下目录布局:
res/drawable -- sandwiches -- tunaOnRye.png -- hamAndSwiss.png -- drinks -- coldOne.png -- hotTea.png
我可以参考金枪鱼沙拉三明治的形象作为@ drawable / sandwiches / tunaOnRye
或者我必须保持层次平坦的绘图目录。
不,资源机制不支持可绘制目录中的子文件夹,所以是的 – 你需要保持这个层次结构的平坦。
您显示的目录布局将导致没有可用的图像。
从我自己的实验看来,如果在res/drawable
文件夹中有一个子文件夹中的任何项目,将导致资源编译器失败 – 阻止正确生成R.java
文件。
我使用的解决方法(和一个Android本身似乎赞成)是基本上用一个下划线替换正斜杠,所以你的结构看起来像这样:
sandwich_tunaOnRye.png sandwich_hamAndSwiss.png drink_coldOne.png drink_hotTea.png
这个方法要求你在命名时要细致一些,而且不会让文件本身变得更加简单(如果你认为饮料和三明治应该都是“ food
”的话,那么你就不得不进行批量重命名,而不是简单地把他们移动到目录); 但是与等效的文件夹结构相比,您的编程逻辑的复杂性不会太糟糕。
这种情况真的很糟糕。 Android是精彩和糟糕的设计决定的混合包。 我们只能希望后面的一部分能够全部清理掉:)
是的 – 它吸吮:)但是,您可以使用资产文件夹,并在那里有子目录,并以这种方式加载图像。
使用资产文件夹。
示例代码:
InputStream is = null; try { is = this.getResources().getAssets().open("test/sample.png"); } catch (IOException e) { ; } image = BitmapFactory.decodeStream(is);
其实,在Android Studio上是可能的。 你可以有如下所示的嵌套资源:
还有一个插件可以在这里对资源进行分组。
我已经写了一个eclipse插件,允许通过用两个下划线__
分隔文件名来创建虚拟子文件夹。 该项目处于早期阶段,但不要担心它不会使您的IDE崩溃
更多的细节可以在这里找到,随便叉和发送拉请求:
我喜欢用一个简单的脚本来将由设计者提供的有组织的目录结构扁平化为可以用来生成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
在Android Gradle工作室中,您可以拥有多个源代码导向器,这将允许您分离资源。 例如:
android { .... android.sourceSets { main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res'] } .... }
然而,名字不能碰撞,这意味着你仍然需要名字,如sandwiches_tunaOnRye,但你将能够为你所有的三明治有一个单独的部分。
这允许您将资源存储在不同的结构中(对于自动生成的内容(如actionbargenerator)非常有用)
部分解决问题的方法之一是使用API级别后缀。 我使用res / layout-v1,res / layout-v2等来在同一个apk中保存多个子项目。 这个机制可以用于所有的资源类型。
显然,只有在res / layout-v之上的API级别上才能使用。 你正在使用。
另外,请注意Android 1.5和1.6中的错误。 请参阅关于API级别后缀的Andoroid文档 。
随着图书馆系统的出现,为每个大型资产创建一个图书馆可能是一个解决方案。
这仍然是个问题,因为必须避免在所有资产中使用相同的名称,但是使用每个库的前缀方案应该有所帮助。
这不像创建文件夹那么简单,但是可以帮助保持健康。
这不是完美的方法。 你必须以相同的方式显示在这里 。
您也可以通过您可以使用的代码来调用该文件夹下的图像
Resources res = getResources(); Drawable shape = res. getDrawable(R.drawable.gradient_box); TextView tv = (TextView)findViewByID(R.id.textview); tv.setBackground(shape);
不是我的,但我找到这个线程时,寻找这个问题,如果您使用Android Studio和Gradle构建系统它非常容易没有插件需要只是一个小编译文件编辑
Gradle与Android Studio可以这样做( 链接 )。
在“配置结构”一节中
sourceSets { main { java { srcDir 'src/java' } resources { srcDir 'src/resources' } } }
对于这种情况,有一种解决方法:可以在与默认res
文件夹相同的级别上创建resVector
(例如)文件夹。 你可以在那里添加任何drawable-xxx
资源文件夹:
resVector -drawable -layout -color
之后,所有你需要的是添加
sourceSets { main.res.srcDirs += 'src/main/resVector' }
到您的build.gradle
文件(在android { }
)。
#!/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?("/") }
检查Bash Flatten文件夹脚本 ,将文件夹层次结构转换为单个文件夹
资产/您可以使用它来存储原始资产文件。 您在这里保存的文件按原样编译为.apk文件,并保留原始文件名。 您可以像使用URI的典型文件系统一样导航此目录,并使用AssetManager将文件作为字节流读取。 例如,这是一个很好的纹理和游戏数据的位置。 http://developer.android.com/tools/projects/index.html
子目录不被允许,资源只能包含[a-z0-9_。]。
不,你有大写字母,也没有正斜杠。
在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' } } }