Может ли каталог android drawable содержать подкаталоги?



в документации по Android SDK все примеры, используемые с синтаксисом xml @drawable/my_image, напрямую обращаются к изображениям, которые хранятся в каталоге res/drawable в моем проекте.

Мне интересно, если это явно не нормально создавать вложенные папки в каталог drawable.

например, если бы у меня был следующий макет каталога:

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

могу ли я ссылаться на изображение бутерброда с салатом из тунца как @drawable / сэндвичи / tunaOnRye

или мне нужно сохранить иерархию плоской в каталоге drawable.

335   19  

19 ответов:

нет, механизм ресурсов не поддерживает подпапки в каталоге drawable, поэтому да - вам нужно сохранить эту иерархию плоской.

макет каталога, который вы показали, приведет к тому, что ни одно из изображений не будет доступно.

из моих собственных экспериментов кажется, что наличие подпапки с любыми элементами в ней, в пределах res/drawable папка, приведет к сбою компилятора ресурсов -- предотвращение R.java файл создается правильно.

обходной путь, который я использую (и сам Android, похоже, предпочитает), заключается в том, чтобы по существу заменить подчеркивание на прямую косую черту, поэтому ваша структура будет выглядеть примерно так:

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

подход требует от вас быть скрупулезным в вашем именовании и не делает его намного легче спорить сами файлы (если вы решили, что напитки и бутерброды должны действительно все быть"food", вам нужно будет сделать массовое переименование, а не просто переместить их в каталог); но сложность вашей логики программирования не страдает слишком плохо по сравнению с эквивалентной структурой папок.

эта ситуация действительно хреновая. Android-это смешанный пакет замечательных и ужасных дизайнерских решений. Мы можем только надеяться, что последняя часть будет отсеяна со всей возможной поспешностью:)

Да-это отстой :) однако вы можете использовать папку assets и иметь подкаталоги там и загружать изображения таким образом.

на самом деле, на Android Studio это возможно. Вы можете иметь вложенные ресурсы, как показано здесь:

enter image description here

есть также плагин для группировки ресурсов здесь.

использовать папку активов.

пример кода:

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

image = BitmapFactory.decodeStream(is);

Я написал плагин eclipse, который позволяет создавать виртуальную подпапку, разделяя имя файла двумя подчеркиваниями __. Проект находится на ранних стадиях, но не волнуйтесь, что он не разрушит вашу IDE

более подробную информацию можно найти здесь, не стесняйтесь раскошелиться и отправить pull запросы:

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

enter image description here

Мне нравится использовать простой скрипт, чтобы сгладить организованную структуру каталогов, предоставленную дизайнерами, до чего-то, что можно использовать для создания файла 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

в android studio с gradle вы можете иметь несколько исходных директоров, которые позволят вам разделить ресурсы. Например:

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

однако имена не должны сталкиваться, что означает, что вам все равно нужно будет иметь имена, такие как sandwiches_tunaOnRye, но вы сможете иметь отдельный раздел для всех ваших бутербродов.

Это позволяет хранить ресурсы в различных структурах (полезно для автоматического создания контента, такого как actionbargenerator)

один из способов частично обойти проблему-использовать суффикс уровня API. Я использую res/layout-v1, res / layout-v2 и т. д. Для хранения нескольких подпроектов в одном apk. Этот механизм можно использовать для всех типов ресурсов.

очевидно, что это может быть использовано только в том случае, если вы ориентируетесь на уровни API выше res/layout-v? вы используете.

кроме того, следите за ошибка в Android 1.5 и 1.6. см. документацию Andoroid о суффиксе уровня API.

с появлением библиотечной системы, создание библиотеки за большой набор активов может быть решением.

Это все еще проблематично, так как нужно избегать использования одних и тех же имен во всех активах, но использование префиксной схемы для каждой библиотеки должно помочь в этом.

Это не так просто, как возможность создания папок, но это помогает держать вещи в здравом уме...

есть решение для этой ситуации: вы можете создать resVector (например) папка на том же уровне, что и по умолчанию . Там вы можете добавить любой drawable-xxx ресурсе есть папки:

resVector
-drawable
-layout
-color

после этого все, что вам нужно, это добавить

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

в своем (внутри android { }).

Это не идеальные методы. Вы должны реализовать тот же путь, который отображается здесь.

вы также можете вызвать изображение под папкой через код, который вы можете использовать

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

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

Не мой, но я нашел эту тему при поиске этой проблемы, если вы используете Android Studio и Gradle Build system его довольно легко нет плагинов, необходимых только для небольшого редактирования файла сборки

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

Gradle с Android Studio может сделать это таким образом (ссылке).

в пункте "Настройка структуры"

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

создать папку в 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'
                    }
                }
            }
#!/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?("/")
}

Регистрация Bash сгладить папку script который преобразует иерархию папок в одну папку

активы/ Вы можете использовать его для хранения файлов необработанных активов. Файлы, которые вы сохраняете здесь, компилируются в an .APK файл как есть, и исходное имя файла сохранилось. Вы можете перемещаться по этому каталогу так же, как и в обычной файловой системе, используя URI, и читать файлы в виде потока байтов с помощью AssetManager. Например, это хорошее место для текстур и игровых данных. http://developer.android.com/tools/projects/index.html

подкаталоги не допускаются, ресурс должен содержать только [a-z0-9_.].

нет у вас есть заглавные буквы, и никаких косых черт.

    Ничего не найдено.

Добавить ответ:
Отменить.