Может ли каталог 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.
19 ответов
нет, механизм ресурсов не поддерживает вложенные папки в каталоге drawable, поэтому да - вам нужно сохранить эту иерархию плоской.
макет каталога, который вы показали, не приведет ни к одному из доступных изображений.
из моих собственных экспериментов кажется, что наличие подпапки с любыми элементами в ней, внутри res/drawable
папка, приведет к сбою компилятора ресурсов -- предотвращение R.java
файл создается правильно.
обходной путь, который я использую (и сам Android, похоже, предпочитает), по существу заменяет подчеркивание для прямой косой черты, поэтому ваша структура будет выглядеть примерно так:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
подход требует от вас быть дотошным в своем названии и не делает его намного проще пререкаться сами файлы (если вы решили, что напитки и бутерброды должны действительно все быть"food
", вам нужно будет сделать массовое переименование, а не просто переместить их в каталог); но сложность вашей логики программирования не страдает слишком плохо по сравнению с эквивалентом структуры папок.
эта ситуация действительно хреновая. Android-это смешанный мешок замечательных и ужасных дизайнерских решений. Мы можем только надеяться, что последняя часть будет прополота со всей должной поспешностью:)
Да-это отстой :) однако вы можете использовать папку assets и иметь подкаталоги там и загружать изображения таким образом.
использовать папку assets.
пример кода:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
Я написал плагин eclipse, который позволяет создавать виртуальную подпапку, разделяя имя файла двумя подчеркиваниями __
. Проект находится на ранних стадиях, но не волнуйтесь, он не приведет к сбою вашей IDE
более подробную информацию можно найти здесь, не стесняйтесь раскошелиться и отправить pull запросы:
Мне нравится использовать простой скрипт, чтобы сгладить организованную структуру каталогов, предоставленную дизайнерами, до чего-то, что можно использовать для создания файла 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 его довольно легко нет плагинов, необходимых только немного редактирования файлов сборки
Gradle с Android Studio может сделать это таким образом (ссылке).
это в абзаце "настройка структуры"
sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
создайте папку в main. как: 'res_notification_btn'
и создайте папку дерева внутри. как "drawable" или "макет"
затем в ' 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 выравнивает скрипт папки который преобразует иерархию папок в одну папку
активы/ Вы можете использовать его для хранения необработанных файлов активов. Файлы, которые вы сохраняете здесь, компилируются в an .APK файл как есть, и исходное имя файла сохранилось. Вы можете перемещаться по этому каталогу так же, как и по обычной файловой системе, используя URIs, и читать файлы как поток байтов с помощью AssetManager. Например, это хорошее место для текстур и игровых данных. http://developer.android.com/tools/projects/index.html
подкаталоги не допускаются, ресурс должен содержать только [a-z0-9_.].
нет у вас есть заглавные буквы и никаких косых черт.