web-dev-qa-db-fra.com

Le répertoire 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 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é?.

468
Pepper Lebeck-Jobe

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.

516
Reto Meier

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

147
Cheezmeister

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

enter image description here

Il existe également un plugin pour regrouper les ressources ici .

34
android developer

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.

34
dijipiji

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);
23
milkia

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:

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

enter image description here

20
Kirill Kulakov

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

9
Alec Holmes

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
9
Rene

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 .

4
OferR

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

3
Anton Derevyanko

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

3
shi

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'
    }
 }
}
1
user3290180

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'
                    }
                }
            }
1
Ali Bagheri

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.

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

1
Captnwalker1

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);
1
user3177928
#!/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
Blake Miller

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

0
Alex M

Vérifiez script Bash Flatten Folder qui convertit la hiérarchie des dossiers en un seul dossier

0
Sneg

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.

0
Ferhat Aslan