Dans la documentation du SDK Android, tous les exemples utilisés avec la syntaxe xml @ drawable/my_image s'adressent directement aux images stockées dans le répertoire res/drawable de mon projet.
Je me demande s'il n'est pas explicitement possible de créer un sous-répertoire dans le répertoire drawable.
Par exemple, si j'avais la disposition de répertoire suivante:
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
Pourrais-je faire référence à l'image d'un sandwich à la salade de thon: @ dessinable/sandwiches/thon
Ou dois-je garder la hiérarchie à plat dans le répertoire pouvant être dessiné?.
Non, le mécanisme de ressources ne prend pas en charge les sous-dossiers du répertoire extractible. Par conséquent, vous devez conserver cette hiérarchie à plat.
La disposition du répertoire que vous avez montrée ne ferait en sorte qu'aucune des images ne soit disponible.
D'après mes propres expériences, il semble que le fait d'avoir un sous-dossier contenant des éléments, dans le dossier res/drawable
, entraîne l'échec du compilateur de ressources, empêchant ainsi la génération correcte du fichier R.Java
.
La solution que j'utilise (et celle Android elle-même semble privilégiée) consiste essentiellement à substituer un trait de soulignement à une barre oblique afin que votre structure ressemble à ceci:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
L’approche exige que vous soyez méticuleux dans votre nom et ne facilite pas beaucoup la tâche de traiter les fichiers eux-mêmes (si vous décidiez que les boissons et les sandwichs devaient vraiment être "food
", vous auriez à faire une renommer en masse plutôt que de simplement les déplacer dans le répertoire); mais la complexité de votre logique de programmation ne souffre pas aussi mal par rapport à la structure de dossiers équivalente.
Cette situation est vraiment nulle. Android est un mélange de décisions de conception merveilleuses et terribles. Nous ne pouvons qu'espérer que cette dernière partie soit éliminée en toute hâte :)
Oui, ça craint :) Cependant, vous pouvez utiliser le dossier des ressources, y inclure des sous-répertoires et charger les images de cette façon.
Utiliser le dossier des actifs.
exemple de code:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
J'ai écrit un plugin Eclipse qui permet de créer un sous-dossier virtuel en séparant le nom du fichier avec deux traits de soulignement __
. Le projet en est à ses débuts, mais ne vous inquiétez pas, il ne plantera pas votre IDE
plus de détails peuvent être trouvés ici, n'hésitez pas à fourchette et envoyer des demandes de traction:
Dans Android studio avec dégradé, vous pouvez avoir plusieurs directeurs de source, ce qui vous permettra de séparer les ressources. Par exemple:
Android {
....
Android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
Cependant, les noms ne doivent pas entrer en collision, ce qui signifie que vous aurez toujours besoin de noms tels que sandwiches_tunaOnRye, mais vous pourrez créer une section distincte pour tous vos sandwichs.
Cela vous permet de stocker vos ressources dans différentes structures (utile pour le contenu généré automatiquement tel que actionbargenerator).
J'aime utiliser un script simple pour aplatir une structure de répertoires organisée fournie par les concepteurs en une chose pouvant être utilisée pour générer un fichier R.
Exécuter avec le chemin actuel dans 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
Une façon de contourner partiellement le problème consiste à utiliser le suffixe de niveau API. J'utilise res/layout-v1, res/layout-v2, etc. pour contenir plusieurs sous-projets dans le même apk. Ce mécanisme peut être utilisé pour tous les types de ressources.
Évidemment, cela ne peut être utilisé que si vous ciblez des niveaux d’API supérieurs à res/layout-v? vous utilisez.
Surveillez également le bogue dans Android 1.5 et 1.6. Voir la documentation Andoroid sur le suffixe de niveau API .
Il existe une solution de contournement à cette situation: vous pouvez créer un dossier resVector
(par exemple) au même niveau que le dossier par défaut res
. Vous pouvez y ajouter les dossiers de ressources drawable-xxx
:
resVector
-drawable
-layout
-color
Après cela, tout ce dont vous avez besoin est d'ajouter
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
dans votre fichier build.gradle
(dans Android { }
).
Avec l'avènement du système de bibliothèque, la création d'une bibliothèque par grand ensemble de ressources pourrait être une solution.
C'est toujours problématique car il faut éviter d'utiliser les mêmes noms dans tous les actifs, mais l'utilisation d'un schéma de préfixes par bibliothèque devrait aider à résoudre ce problème.
Ce n'est pas aussi simple que de pouvoir créer des dossiers, mais cela aide à garder les choses saines ...
Gradle avec Android Studio pourrait le faire de cette façon ( lien ).
C'est dans le paragraphe "Configuration de la structure"
sourceSets {
main {
Java {
srcDir 'src/Java'
}
resources {
srcDir 'src/resources'
}
}
}
créer un dossier dans main. comme: 'res_notification_btn'
et créer un dossier d'arborescence. comme 'drawable' ou 'layout'
puis dans 'build.gradle' ajoutez ceci
sourceSets
{
main
{
res
{
srcDirs = ['src/main/res_notification_btn', 'src/main/res']
or
srcDir 'src/main/res_notification_btn'
}
}
}
Ce n’est pas le mien, mais j’ai trouvé ce fil de discussion lorsque je cherchais ce problème. Si vous utilisez Android Studio et le système Gradle Build, c’est assez facile, aucun plugin n’est nécessaire, juste un peu d’édition de fichier de construction.
Ce ne sont pas des méthodes parfaites. Vous devez mettre en œuvre de la même manière ce qui est l'affichage ici .
Vous pouvez également appeler l’image située dans le dossier à l’aide du code que vous pouvez utiliser.
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
#!/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?("/")
}
assets/Vous pouvez l'utiliser pour stocker des fichiers d'actifs bruts. Les fichiers que vous enregistrez ici sont compilés dans un fichier .apk tels quels, et le nom de fichier d'origine est préservé. Vous pouvez naviguer dans ce répertoire de la même manière qu'un système de fichiers classique utilisant des URI et lire des fichiers sous forme de flux d'octets à l'aide de AssetManager. Par exemple, c'est un bon emplacement pour les textures et les données de jeu. http://developer.Android.com/tools/projects/index.html
Vérifiez script Bash Flatten Folder qui convertit la hiérarchie des dossiers en un seul dossier
Les sous-répertoires ne sont pas autorisés, la ressource ne doit contenir que [a-z0-9_.].
Non, vous avez des lettres majuscules et pas de barres obliques.