Может ли каталоги с Android-графикой содержать подкаталоги?
В документации Android SDK все примеры, используемые с синтаксисом @drawable/my_image xml, напрямую адресуют изображения, которые хранятся в каталоге res/drawable в моем проекте.
Мне интересно, если явно не нормально создавать подкаталог в выпадающем каталоге.
Например, если у меня был следующий макет каталога:
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
Могу ли я ссылаться на изображение сэндвича салата из тунца как @вытягиваемый/бутерброды/тунецОнРуе
Или мне нужно сохранить иерархию в выпадающем каталоге.
Ответы
Ответ 1
Нет, механизм ресурсов не поддерживает вложенные папки в выпадающем каталоге, поэтому да - вам нужно сохранить эту иерархию плоской.
Представленный вами макет каталога не приведет ни к одному из доступных изображений.
Из моих собственных экспериментов кажется, что наличие вложенной папки с любыми элементами в ней в папке res/drawable
приведет к сбою компилятора ресурсов - предотвращение корректной генерации файла R.java
.
Ответ 2
Обходной путь, который я использую (и, по-видимому, сам Android), заключается в том, чтобы существенно заменить подчеркивание для косой черты, поэтому ваша структура будет выглядеть примерно так:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
Подход требует, чтобы вы были дотошны в своем наименовании и не стали намного проще спорить с самими файлами (если вы решили, что напитки и бутерброды должны действительно быть "food
", вам нужно будет сделать массовое переименование, а не просто перемещение их в каталог); но сложность вашей логики программирования не страдает слишком сильно по сравнению с эквивалентом структуры папок.
Эта ситуация действительно отстойная. Android - это смешанная сумка замечательных и страшных дизайнерских решений. Мы можем только надеяться, что последняя часть будет вытеснена со всей поспешностью:)
Ответ 3
Да - это сосать:) Однако вы можете использовать папку с ресурсами и иметь подкаталоги там и загружать изображения таким образом.
Ответ 4
Собственно, на Android Studio это возможно. У вас могут быть вложенные ресурсы, как показано здесь:
![введите описание изображения здесь]()
Существует также плагин для группировки ресурсов здесь.
Ответ 5
Используйте папку с ресурсами.
пример кода:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
Ответ 6
Я написал плагин eclipse, который позволяет создавать виртуальную подпапку, разделяя имя файла двумя символами подчеркивания __
. Проект находится на ранних стадиях, но не беспокойтесь, он не разрушит вашу среду IDE
более подробную информацию можно найти здесь, не стесняясь вилкой и отправляя запросы на тягу:
https://github.com/kirill578/Android-Sorted-Res-Folder
![enter image description here]()
Ответ 7
Мне нравится использовать простой script, чтобы сгладить организованную структуру каталогов, предоставляемую дизайнерами, к чему-то, что может быть использовано для генерации 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
Ответ 8
В студии Android с gradle у вас может быть несколько источников, которые позволят вам разделить ресурсы. Например:
android {
....
android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
Однако имена не должны сталкиваться, что означает, что вам все равно нужно будет иметь имена, такие как sandwiches_tunaOnRye, но вы сможете иметь отдельный раздел для всех ваших сэндвичей.
Это позволяет хранить ресурсы в разных структурах (полезно для автоматически созданного контента, такого как actionbargenerator)
Ответ 9
Один из способов частично решить проблему - использовать суффикс уровня API.
Я использую res/layout-v1, res/layout-v2 и т.д. Для хранения нескольких подпроектов в одном и том же apk.
Этот механизм может использоваться для всех типов ресурсов.
Очевидно, что это можно использовать, только если вы настроите уровни API выше res/layout-v? вы используете.
Также обратите внимание на ошибку в Android 1.5 и 1.6.
См. документацию Andoroid о суффиксе уровня API.
Ответ 10
С появлением библиотечной системы создание библиотеки для большого набора активов может быть решением.
Это по-прежнему проблематично, так как нужно избегать использования одинаковых имен во всех активах, но использование схемы префикса для библиотеки должно помочь в этом.
Это не так просто, как возможность создавать папки, но это помогает сохранить смысл...
Ответ 11
Существует обходной путь для этой ситуации: вы можете создать папку resVector
(например) на том же уровне, что и папка по умолчанию res
. Там вы можете добавить любые папки ресурсов drawable-xxx
:
resVector
-drawable
-layout
-color
После этого вам нужно только добавить
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
в ваш build.gradle
файл (внутри android { }
).
Ответ 12
Это не идеальные методы. Вы должны реализовать тот же самый способ, который отображается здесь.
Вы также можете вызвать изображение под папкой с помощью кода, который вы можете использовать
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
Ответ 13
Не мой, но я нашел эту тему при поиске этой проблемы, если вы используете Android Studio и Gradle Build system, ее довольно легко нет плагинов, необходимых для редактирования небольшого файла сборки
fooobar.com/questions/16929/...
Ответ 14
Gradle с Android Studio может сделать это так (ссылка).
Это в параграфе "Конфигурирование структуры"
sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
Ответ 15
создать папку в основном.
например: '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'
}
}
}
Ответ 16
#!/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?("/")
}
Ответ 17
Отметьте Bash Сгладить папку script, которая преобразует иерархию папок в одну папку
Ответ 18
активы/ Вы можете использовать его для хранения файлов сырых активов. Файлы, которые вы сохраняете здесь, скомпилированы в файл .apk as-is и исходное имя файла сохраняется. Вы можете перемещаться по этому каталогу так же, как обычная файловая система с использованием URI и читать файлы в виде потока байтов с помощью AssetManager. Например, это хорошее место для текстур и игровых данных.
http://developer.android.com/tools/projects/index.html
Ответ 19
Подкаталоги не разрешены, ресурс должен содержать только [a-z0-9 _.].
Нет, у вас есть заглавные буквы и нет косой черты.