android drawable文件夹,Android drawable目录可以包含子目录吗?

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

在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目录中。

20个解决方案

488 votes

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

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

根据我自己的实验,似乎在res/drawable文件夹中包含其中包含任何项目的子文件夹将导致资源编译器失败 - 阻止正确生成R.java文件。

Reto Meier answered 2019-03-29T16:29:39Z

143 votes

我正在使用的解决方法(以及Android本身似乎更喜欢)是基本上用下划线代替正斜杠,所以你的结构看起来像这样:

sandwich_tunaOnRye.png

sandwich_hamAndSwiss.png

drink_coldOne.png

drink_hotTea.png

这种方法要求你在命名时要细致,并且不要让文件本身更容易纠结(如果你认为饮料和三明治应该都是“food”,你必须进行大规模重命名,而不是 只需将它们移动到目录中); 但是,与文件夹结构相比,你的编程逻辑的复杂性不会太糟糕。

这种情况确实很糟糕。 Android是一系列精彩而可怕的设计决策。 我们只能希望后一部分得到彻底清除所有应有的急速:)

Cheezmeister answered 2019-03-29T16:30:23Z

32 votes

是的 - 确实很糟糕:)但是你可以使用assets文件夹并在那里有子目录并以这种方式加载图像。

dijipiji answered 2019-03-29T16:30:48Z

29 votes

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

bf9c98c0e1ee4b95365ac7c498eb0bea.png

还有一个插件可以在这里分组资源。

android developer answered 2019-03-29T16:31:21Z

22 votes

使用assets文件夹。

示例代码:

InputStream is = null;

try {

is = this.getResources().getAssets().open("test/sample.png");

} catch (IOException e) {

;

}

image = BitmapFactory.decodeStream(is);

milkia answered 2019-03-29T16:31:49Z

20 votes

我写了一个eclipse插件,允许通过用两个下划线__分隔文件名来创建虚拟子文件夹。该项目处于早期阶段,但不要担心它不会崩溃你的IDE

更多细节可以在这里找到,随意分叉和发送拉取请求:

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

430d9fd876df16641e464ca42f1350b3.png

Kirill Kulakov answered 2019-03-29T16:32:30Z

9 votes

我喜欢使用一个简单的脚本来将设计者提供的有组织的目录结构展平为可以用来生成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

Rene answered 2019-03-29T16:33:03Z

9 votes

在带有gradle的android studio中,您可以拥有多个源控制器,这将允许您分离资源。 例如:

android {

....

android.sourceSets {

main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']

}

....

}

但是名字一定不能碰撞,这意味着你仍然需要有像sandwiches_tunaOnRye这样的名字,但是你可以为你所有的三明治分开一个单独的部分。

这允许您将资源存储在不同的结构中(对于自动生成的内容很有用,例如actionbargenerator)

Alec Holmes answered 2019-03-29T16:33:48Z

4 votes

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

显然,只有当您将API级别定位在res / layout-v之上时才能使用此功能? 您正在使用。

另外,请注意Android 1.5和1.6中的错误。请参阅有关API级别后缀的Android文档。

OferR answered 2019-03-29T16:34:29Z

2 votes

随着图书馆系统的出现,每个大型资产创建一个库可能是一个解决方案。

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

它并不像能够创建文件夹那么简单,但这有助于保持理智...

shi answered 2019-03-29T16:35:15Z

2 votes

这种情况有一种解决方法:您可以在与默认android { }文件夹相同的级别上创建一个build.gradle(例如)文件夹。 在那里你可以添加任何drawable-xxx资源文件夹:

resVector

-drawable

-layout

-color

之后,您只需要添加

sourceSets {

main.res.srcDirs += 'src/main/resVector'

}

进入你的build.gradle文件(android { }内)。

Anton Derevyanko answered 2019-03-29T16:35:55Z

1 votes

这不是完美的方法。 你必须实现在这里显示的相同方式。

您还可以通过可以使用的代码调用文件夹下的图像

Resources res = getResources();

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

TextView tv = (TextView)findViewByID(R.id.textview);

tv.setBackground(shape);

user3177928 answered 2019-03-29T16:36:29Z

1 votes

不是我的,但是在寻找这个问题时我找到了这个帖子,如果你使用Android Studio和Gradle Build系统很简单,那么只需要一点点构建文件编辑就不需要插件

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

Captnwalker1 answered 2019-03-29T16:37:04Z

1 votes

Gradle with Android Studio可以这样做(链接)。

它位于“配置结构”一节中

sourceSets {

main {

java {

srcDir 'src/java'

}

resources {

srcDir 'src/resources'

}

}

}

user3290180 answered 2019-03-29T16:37:37Z

1 votes

在main中创建一个文件夹。  喜欢:'res_notification_btn'

并在。中创建树文件夹,如'drawable'或'layout'

然后在'build.gradle'中添加此项

sourceSets

{

main

{

res

{

srcDirs = ['src/main/res_notification_btn', 'src/main/res']

or

srcDir 'src/main/res_notification_btn'

}

}

}

Ali Bagheri answered 2019-03-29T16:38:19Z

0 votes

#!/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?("/")

}

Blake Miller answered 2019-03-29T16:38:38Z

0 votes

检查将文件夹层次结构转换为单个文件夹的Bash Flatten Folder脚本

Sneg answered 2019-03-29T16:39:02Z

0 votes

资产/     您可以使用它来存储原始资产文件。 您在此处保存的文件将按原样编译为.apk文件,并保留原始文件名。 您可以使用URI以与典型文件系统相同的方式导航此目录,并使用AssetManager将文件作为字节流读取。 例如,这是纹理和游戏数据的良好位置。[http://developer.android.com/tools/projects/index.html]

Alex M answered 2019-03-29T16:39:29Z

0 votes

不允许使用子目录,资源必须仅包含[a-z0-9_。]。

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

Ferhat Aslan answered 2019-03-29T16:40:04Z

-1 votes

右键单击Drawable

选择New ---> 目录

输入目录名称。 例如:logo.png(默认情况下该位置已经显示了drawable文件夹)

将图像直接复制并粘贴到drawable文件夹中。 粘贴时,您可以选择为列表中的每个图像选择mdpi / xhdpi / xxhdpi等。 选择适当的选项并输入图像的名称。 确保与目录名称保持相同的名称,即logo.png

对剩余的图像执行相同的操作。 所有这些都将放在logo.png主文件夹下。

Afreen Hasheem Siraj answered 2019-03-29T16:41:01Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值