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.

433
demandé sur user2864740 2009-07-03 04:30:07

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.

484
répondu Reto Meier 2009-07-03 11:37:26

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:)

142
répondu Cheezmeister 2011-02-03 17:57:18

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.

31
répondu dijipiji 2010-10-07 09:37:31

en fait, sur Android Studio, il est possible. Vous pouvez avoir des ressources imbriquées comme indiqué ici :

enter image description here

il y a aussi un plugin pour grouper des ressources ici .

28
répondu android developer 2015-08-14 10:45:15

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);
22
répondu milkia 2011-05-12 12:38:48

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

enter image description here

20
répondu Kirill Kulakov 2014-05-03 15:29:07

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
9
répondu Rene 2011-11-30 10:54:53

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)

9
répondu Alec Holmes 2014-10-03 08:54:22

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 .

4
répondu OferR 2010-11-27 09:31:54

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...

2
répondu shi 2012-08-20 01:42:15

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 { } ).

2
répondu Anton Derevyanko 2017-04-07 12:08:15

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);
1
répondu user3177928 2014-01-09 14:39:45

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

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

1
répondu Captnwalker1 2017-05-23 12:34:38

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'
    }
 }
}
1
répondu user3290180 2015-07-30 07:46:51

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'
                    }
                }
            }
1
répondu Ali Bagheri 2017-03-29 06:43:12
#!/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?("/")
}
0
répondu Blake Miller 2013-03-29 17:59:02

Vérifier Bash Aplatir Dossier script qui convertit hiérarchie de dossiers dans un seul dossier

0
répondu Sneg 2014-05-14 08:32:23

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

0
répondu Alex M 2014-06-01 17:24:47
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 aucun slash avant.

0
répondu Ferhat Aslan 2015-09-13 14:38:46