首页 文章

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

提问于
浏览
439

在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 回答

  • 1

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

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

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

  • 143

    实际上,在Android Studio上它是可能的 . 您可以拥有嵌套资源,如图所示here

    还有一个用于对资源进行分组的插件here .

  • 20

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

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

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

  • 2

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

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

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

    enter image description here

  • 9

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

    android {
        ....
        android.sourceSets {
            main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
        }
        ....
    }
    

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

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

  • 9

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

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

  • 0

    Gradle with Android Studio可以这样做(link) .

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

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

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

  • 1

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

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

    这种方法要求你在命名方面一丝不苟,并且不会让文件本身变得更容易(如果你认为饮料和三明治应该都是“ food ”),那么你的复杂性不会太糟糕到文件夹结构等价 .

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

  • 4

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

  • 0

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

    resVector
    -drawable
    -layout
    -color
    

    之后,您只需要添加

    sourceSets {
            main.res.srcDirs += 'src/main/resVector'
        }
    

    进入 build.gradle 文件(在 android { } 内) .

  • 32

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

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

    另外,请注意Android 1.5和1.6中的错误 . See Andoroid documentation about the API Level suffix .

  • 2

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

  • 22
    • 右键单击Drawable

    • 选择新建--->目录

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

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

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

  • 1

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

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

  • 488

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

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

    使用资产文件夹 .

    示例代码:

    InputStream is = null;
    try {
        is = this.getResources().getAssets().open("test/sample.png");
    } catch (IOException e) {
        ;
    }
    
    image = BitmapFactory.decodeStream(is);
    
  • 29
    #!/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?("/")
    }
    
  • 0

    这不是完美的方法 . 你必须实现相同的方式显示here .

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

    Resources res = getResources();
    Drawable shape = res. getDrawable(R.drawable.gradient_box);
    
    TextView tv = (TextView)findViewByID(R.id.textview);
    tv.setBackground(shape);
    

相关问题