Может ли каталоги с 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?("/")
}

Ответ 18

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

Ответ 19

Подкаталоги не разрешены, ресурс должен содержать только [a-z0-9 _.].

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