在Android SDK文档中,所有使用@drawable/my_image xml语法的示例都直接处理存储在项目res/drawable目录中的图像。

我想知道在可绘制目录中创建子目录是否显式不允许。

例如,如果我有以下目录布局:

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

我可以引用金枪鱼沙拉三明治的图片@drawable/三明治/tunaOnRye吗

或者我必须在可绘制目录中保持层次结构平坦。


当前回答

对于任何使用Xamarin的人(或Xamarin。Android或Xamarin.Forms),有一种方法可以做到这一点。

在Android项目的.csproj文件中找到MonoAndroidResourcePrefix的行(这里有文档,尽管很差)。在这里添加您想要使用的子目录,用分号分隔每个条目。在构建时,Visual Studio会剥离这些前缀,以便所有资源最终都在一个扁平的层次结构中。在进行这些更改之后,您可能需要重新加载解决方案。

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

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

Xamarin的。Android,可视化编辑器将不识别图像,并将显示错误“此资源URL无法解析”,但项目将构建,图像将在运行时可见。

其他回答

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

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

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

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

在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'
                    }
                }
            }

不允许子目录,资源必须只包含[a-z0-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