Может ли каталог рисования Android содержать подкаталоги?

StackOverflow https://stackoverflow.com/questions/1077357

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

На самом деле, в 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.

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

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 с gradle вы можете иметь несколько режиссеров исходного кода, что позволит вам разделить ресурсы.Например:

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

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

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

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

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

Также обратите внимание на ошибку в Android 1.5 и 1.6.См. документацию Andoroid о суффиксе уровня API..

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

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

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

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

resVector
-drawable
-layout
-color

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

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

в твой build.gradle файл (внутри 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, это довольно просто, плагины не нужны, просто небольшое редактирование файла сборки.

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

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

Это в пункте «Настройка структуры»

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

создайте папку в main.нравиться:'res_notification_btn'

и создайте папку в виде дерева.например «рисуемый» или «макет»

затем в «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 Flatten Folder который преобразует иерархию папок в одну папку

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

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

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

  1. Щелкните правой кнопкой мыши на Drawable
  2. Выберите Создать ---> Каталог.
  3. Введите имя каталога.Например:logo.png(по умолчанию в этом месте уже будет отображаться папка с возможностью рисования)
  4. Скопируйте и вставьте изображения прямо в папку для рисования.При вставке вы получаете возможность выбрать mdpi/xhdpi/xxhdpi и т. д. для каждого изображения из списка.Выберите подходящий вариант и введите название изображения.Обязательно сохраните то же имя, что и имя каталога, например logo.png.
  5. Сделайте то же самое для остальных изображений.Все они будут помещены в основную папку logo.png.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top