Question Le répertoire dessinable Android peut-il contenir des sous-répertoires?


Dans la documentation du SDK Android, tous les exemples utilisés avec la syntaxe XML @ drawable / my_image abordent directement les images stockées dans le répertoire res / drawable de mon projet.

Je me demande s'il est explicitement impossible de créer un sous-répertoire dans le répertoire pouvant être dessiné.

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 comme @ drawable / sandwiches / tunaOnRye

Ou dois-je garder la hiérarchie à plat dans le répertoire pouvant être dessiné.


423
2017-07-03 00:30


origine


Réponses:


Non, le mécanisme de ressources ne prend pas en charge les sous-dossiers du répertoire pouvant être dessiné, alors oui, vous devez garder cette hiérarchie à plat.

La mise en page du répertoire que vous avez montrée n'entraînerait aucune image disponible.

De mes propres expériences, il semble qu'il y ait un sous-dossier avec des éléments, res/drawable le dossier, provoquera l'échec du compilateur de ressources R.java fichier d'être généré correctement.


477
2017-07-03 11:37



La solution de contournement que j'utilise (et celle que Android lui-même semble privilégier) est de remplacer essentiellement un trait de soulignement par une barre oblique, de sorte 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 dénomination et qu'il ne soit pas beaucoup plus facile de manipuler les fichiers eux-mêmes (si vous décidiez que les boissons et les sandwiches devraient vraiment tous être "food", vous devriez faire un renommage de 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 comparé à l'équivalent de la structure des dossiers.

Cette situation est en effet difficile. Android est un sac mélangé de décisions de conception merveilleuses et terribles. Nous ne pouvons qu'espérer que la dernière partie soit éliminée avec toute la précipitation :)


140
2018-02-03 17:57



Oui - ça craint :) Cependant, vous pouvez utiliser le dossier assets et avoir des sous-répertoires là-bas et charger les images de cette façon.


31
2017-10-07 09:37



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

enter image description here

Il y a aussi un plugin pour regrouper les ressources ici.


27
2017-08-14 10:45



Utilisez le dossier assets.

exemple de code:

InputStream is = null;
try {
    is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
    ;
}

image = BitmapFactory.decodeStream(is);

22
2018-05-12 03:36



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 en est à ses débuts, mais ne vous inquiétez pas, votre IDE ne tombera pas en panne

Plus de détails peuvent être trouvés ici, n'hésitez pas à faire des demandes et à envoyer des requêtes:

https://github.com/kirill578/Android-Sorted-Res-Folder

enter image description here


20
2018-05-03 15:29



J'aime utiliser un script simple pour aplatir une structure de répertoire organisée fournie par les concepteurs pour créer 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

9
2017-11-30 10:54



Dans android studio with gradle vous pouvez avoir plusieurs directeurs de sources qui vous permettront 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 devrez toujours avoir des noms tels que 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 tel que actionbargenerator)


8
2017-10-03 08:54



Une façon de contourner partiellement le problème consiste à utiliser le suffixe API Level. 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 les niveaux de l'API au-dessus de res / layout-v? vous utilisez.

Aussi, faites attention au bogue dans Android 1.5 et 1.6. Voir la documentation d'Andoroid sur le suffixe du niveau d'API.


4
2017-11-27 09:24



Avec l'avènement du système de bibliothèque, la création d'une bibliothèque par grand ensemble d'actifs pourrait être une solution.

Il 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éfixe par bibliothèque devrait y contribuer.

Ce n'est pas aussi simple que de créer des dossiers, mais cela aide à garder les choses saines ...


2
2017-08-20 01:42



Il existe une solution de contournement pour cette situation: vous pouvez créer un resVector (par exemple) dossier au même niveau que par défaut res dossier. Là vous pouvez ajouter n'importe quel drawable-xxx des dossiers de ressources:

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 build.gradle fichier (à l'intérieur android { }).


2
2018-04-07 12:08