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

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

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

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

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

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


当前回答

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

其他回答

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

显然,这只能用于当你的目标API级别高于res/layout-v?你在吸毒。

另外,要注意Android 1.5和1.6中的漏洞。 请参阅有关API Level后缀的Andoroid文档。

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

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

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

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

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

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

在"配置结构"一段中

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

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

这里还有一个插件来对资源进行分组。

但我建议避免这样做。

使用资产文件夹。

示例代码:

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

image = BitmapFactory.decodeStream(is);