Le répertoire android drawable peut-il contenir des sous-répertoires?
dans la documentation 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 correct de créer un sous-répertoire dans le répertoire à dessiner.
par exemple, si j'avais la disposition de répertoire suivante:
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
puis-je me référer à l'image d'une salade de thon sandwich comme @drawable/sandwichs/tunaOnRye
Ou dois-je garder la hiérarchie à plat dans le drawable répertoire.
19 réponses
non, le mécanisme de ressources ne supporte pas les sous - dossiers dans le répertoire dessinable, donc oui-vous devez garder cette hiérarchie plate.
la mise en page du répertoire que vous avez montrée n'aurait pas pour résultat 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 n'importe quel élément du dossier res/drawable
causera l'échec du compilateur de ressources -- empêchant le fichier R.java
d'être généré. correctement.
la solution que j'utilise (et que L'Androïde lui-même semble favoriser) est essentiellement de substituer un underscore à un slash avant, donc votre structure ressemblerait à quelque chose comme 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 rend pas beaucoup plus facile de bricoler les fichiers eux-mêmes (si vous avez décidé que les boissons et les sandwiches devraient vraiment tous être " food
", vous auriez à faire un changement de nom de masse plutôt que de simplement déplacer mais la complexité de votre logique de programmation ne souffre pas trop mal comparé à l'équivalent de structure de dossiers.
cette situation craint en effet. 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 avec toute la diligence voulue:)
Oui - il n'a sucer :) Mais vous pouvez utiliser le dossier des actifs et des sous répertoires là-bas et de charger les images de cette façon.
en fait, sur Android Studio, il est possible. Vous pouvez avoir des ressources imbriquées comme indiqué ici :
il y a aussi un plugin pour grouper des ressources ici .
utilisez le répertoire assets.
code échantillon:
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 underscores __
. Le projet n'en est qu'à ses débuts, mais ne vous inquiétez pas, il ne fera pas planter votre IDE
plus de détails peuvent être trouvés ici, n'hésitez pas à bifurquer et envoyer des demandes de traction:
https://github.com/kirill578/Android-Sorted-Res-Folder
j'aime utiliser un script simple pour aplatir une structure de répertoire organisée fournie par les concepteurs à quelque chose qui peut être utilisé pour générer un fichier R.
Exécuter avec chemin d'accès 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
dans android studio avec gradle, vous pouvez avoir plusieurs directeurs source 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 d'avoir des noms comme sandwiches_tunaOnRye mais vous pourrez avoir une section séparée pour tous vos sandwichs.
cela vous permet de stocker vos ressources dans différentes structures (utile pour le contenu généré automatiquement comme actionbargenerator)
une façon de contourner partiellement le problème est d'utiliser le suffixe de niveau API. J'utilise res/layout-v1, res / layout-v2 etc pour maintenir plusieurs sous-projets dans la 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 au-dessus du res/layout-v? vous êtes en utilisant.
aussi, attention au bug dans Android 1.5 et 1.6. voir documentation Andorienne sur le niveau API le suffixe .
Avec l'avènement du système de bibliothèque, création d'une bibliothèque par grand ensemble des actifs pourrait être une solution.
c'est toujours problématique car il faut éviter d'utiliser les mêmes noms dans tous les biens mais l'utilisation d'un schéma de préfixe par Bibliothèque devrait aider à cela.
ce n'est pas aussi simple que de pouvoir créer des dossiers, mais cela aide à garder les choses saines...
il y a une solution à cette situation: vous pouvez créer un dossier resVector
(par exemple) au même niveau que le dossier res
par défaut. Vous pouvez y ajouter n'importe quels dossiers de ressources drawable-xxx
:
resVector
-drawable
-layout
-color
après cela, il suffit d'ajouter
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
dans votre fichier build.gradle
(à l'intérieur de android { }
).
ce n'est pas des méthodes parfaites. Vous devez mettre en œuvre la même façon qui est l'affichage ici .
vous pouvez également appeler l'image sous le dossier par le 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);
pas le mien, mais j'ai trouvé ce fil lors de la recherche de ce problème, si votre utilisation de Studio Android et Gradle construire le système son assez facile pas de plugins nécessaire juste un peu d'édition de fichier de construction
Gradle avec Android Studio pourrait le faire de cette façon ( lien ).
C'est dans le paragraphe "configurer la Structure"
sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
crée un dossier dans main. comme: 'res_notification_btn '
et créer le dossier de l'arbre. comme "drawable" ou "disposition"
puis dans ' build.ajouter ce qui suit:
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?("/")
}
Vérifier Bash Aplatir Dossier script qui convertit hiérarchie de dossiers dans un seul dossier
actif/ Vous pouvez l'utiliser pour stocker des fichiers d'actifs bruts. Les fichiers que vous enregistrez ici sont compilées dans une .apk fichier en tant que-est, et le nom de fichier d'origine est conservé. Vous pouvez naviguer dans ce répertoire de la même manière qu'un système de fichiers typique en utilisant URIs et lire des fichiers comme un flux d'octets en utilisant L'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
ne sont pas autorisés, la ressource ne doit contenir que [a-z0-9_.].
Non vous avez des lettres majuscules, et aucun slash avant.