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

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

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

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

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

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


当前回答

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

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

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

其他回答

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

sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png

这种方法要求您在命名时一丝不差,并且不会使文件本身变得更容易(如果您决定饮料和三明治真的都应该是“食物”,那么您必须进行大规模重命名,而不是简单地将它们移动到目录中);但是与相同的文件夹结构相比,您的编程逻辑的复杂性并没有受到太大的影响。

这种情况确实很糟糕。Android是一个优秀和糟糕设计决策的混合体。我们只能希望后一部分能尽快被淘汰:)

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

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

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

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

这是不完美的方法。你必须以同样的方式实现,就像这里显示的那样。

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

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

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

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

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

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