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

558
在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 目录下保持层级扁平?


19
请注意,在 res 目录中不允许使用大写字母。 - Tyler
1
你只能使用Gradle来完成这个任务:https://dev59.com/KWQn5IYBdhLWcg3wxZni#19859379 - Yair Kukielka
2
是否可以在drawable目录下创建SIBLING(类似的)目录,并具有drawable功能?例如:res/tanks/drawble-[hdpi等等],这样行吗? - Fattie
3
现在是2023年3月24日,您的翻译请求是:“It's 2021. Has this been solved yet?” 我可以帮助您将其翻译为中文:“现在已经是2023年了,这个问题是否已经得到解决?” 我会尽力使翻译简洁明了并保持原意不变。 - Leszek
4
2022年了,这个问题解决了吗? - Evgeniy Mishustin
显示剩余3条评论
22个回答

3
随着图书馆系统的出现,为每个大型资产集创建一个图书馆可能是一种解决方案。然而,这仍存在问题,因为必须避免在所有资产中使用相同的名称,但使用每个图书馆的前缀方案应该有所帮助。这并不像创建文件夹那么简单,但它有助于保持事情的合理性...

是的,我认为这很不错。如果我将国旗标志添加到我的drawable-ldpi等文件夹中,那么它们将被淹没。我认为为所有通用资源创建库项目将有助于减少您正在积极处理的项目中的混乱。惊讶您只有1个赞成票。 - Tom

1
在主目录下创建一个文件夹,例如:'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'
                    }
                }
            }

1
这不是完美的方法。你需要实现与这里显示相同的方式。
你也可以通过代码调用文件夹中的图像。
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);

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

1

这不是我的问题,但当我寻找解决方法时找到了这个帖子。如果你正在使用Android Studio和Gradle Build系统,那么很容易解决,不需要插件,只需稍微编辑一下构建文件即可。

https://dev59.com/s2445IYBdhLWcg3wTIjm#22426467


1
Gradle和Android Studio可以使用这种方式(链接)进行配置。在“配置结构”段落中有介绍。
sourceSets {
 main {
    java {
        srcDir 'src/java'
    }
    resources {
        srcDir 'src/resources'
    }
 }
}

0

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

不能使用大写字母和正斜杠。


0

0

assets/ 这个文件夹可以用来存储原始资源文件。在这里保存的文件会被编译成一个.apk文件,并保留原始文件名。您可以使用URI以及AssetManager将其作为典型文件系统一样进行导航,并将文件作为字节流读取。例如,这是纹理和游戏数据的好位置。 http://developer.android.com/tools/projects/index.html


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

这只是自动化了Cheezmeister建议的解决方法。对我很有效...能否解释一下为什么要点踩? - Blake Miller

0
对于使用Xamarin(无论是Xamarin.Android还是Xamarin.Forms)的任何人,有一种方法可以做到这一点。
在Android项目的.csproj文件中,找到MonoAndroidResourcePrefix行(尽管文档化得很差,链接在 这里 )。在这里添加您想要使用的子目录,每个条目之间用分号分隔。构建时,Visual Studio会删除这些前缀,以便所有资源都在一个平面层次结构中。可能需要在进行这些更改后重新加载解决方案。

Example of setup in Xamarin

这些目录不需要是项目中默认的资源目录的子目录。

确保添加的文件的构建操作设置为“AndroidResource”。

对于Xamarin.Android,可视化编辑器将无法识别图像并显示错误“无法解析此资源URL”,但项目将生成并且图像在运行时可见。

Error in editor Example in emulator


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接