Question Le dossier Disposition Android peut-il contenir des sous-dossiers?


En ce moment, je stocke chaque fichier de mise en page XML dans le res/layout folder, il est donc possible et simple de gérer de petits projets, mais quand il y a des projets volumineux et lourds, il doit y avoir une hiérarchie et des sous-dossiers dans le dossier layout.

par exemple

layout
-- layout_personal
   -- personal_detail.xml
   -- personal_other.xml
--layout_address
  -- address1.xml
  -- address2.xml

De la même façon, nous aimerions avoir des sous-dossiers pour les applications volumineuses. Y at-il un moyen de le faire dans le projet Android?

Je suis capable de créer des sous-dossiers layout-personal et layout_address dans le dossier layout, mais quand vient le temps d'accéder au fichier de layout xml avec R.layout ._______, il n'y a pas de pop-up de mise en page xml à l'intérieur menu.


464
2018-02-08 06:58


origine


Réponses:


Vous POUVEZ le faire avec Gradle. J'ai fait un projet de démonstration montrant comment.

L'astuce consiste à utiliser la capacité de gradle à fusionner plusieurs dossiers de ressourceset définissez le dossier res ainsi que les sous-dossiers imbriqués dans le bloc sourceSets.

Le problème est que vous ne pouvez pas déclarer un dossier de ressources de conteneur avant de déclarer les dossiers de ressources enfants de ce dossier.

Voici le bloc sourceSets du fichier build.gradle de la démo. Notez que les sous-dossiers sont déclarés en premier.

sourceSets {
    main {
        res.srcDirs =
        [
                'src/main/res/layouts/layouts_category2',
                'src/main/res/layouts',
                'src/main/res'
        ]
    }
}

nested resources picture

De plus, le parent direct de vos fichiers de ressources réels (pngs, mises en page XML, etc.) doit toujours correspondre au spécification.


411
2018-03-15 16:26



La réponse est non.

Je voudrais attirer votre attention sur ce livre Pro Android 2 qui dit:

Il vaut également la peine de noter quelques   contraintes en matière de ressources.   Tout d'abord, Android ne supporte qu'un linéaire   liste de fichiers dans le prédéfini   dossiers sous res. Par exemple, il    ne prend pas en charge les dossiers imbriqués sous   le dossier de mise en page (ou l'autre   dossiers sous res).

Deuxièmement, il y a quelques similitudes   entre le dossier des actifs et le brut   dossier sous res. Les deux dossiers peuvent   contient des fichiers bruts, mais les fichiers   dans les matières premières sont considérées comme des ressources   et les fichiers dans les actifs ne sont pas.

Notez que parce que le contenu de la    les atouts dossier ne sont pas considérés   ressources, vous pouvez mettre un arbitraire   hiérarchie des dossiers et des fichiers dans   il.


225
2018-02-08 07:17



Je voulais juste ajouter à la réponse fantastique d'eskis pour les gens qui ont des problèmes. (Remarque: Cela ne fonctionnera que comme des répertoires séparés dans la vue «projet», et non la vue «Android» malheureusement.)

Testé avec ce qui suit. BuildToolsVersion = 23.0.0 gradation 1.2.3 et 1.3.0

C'est comme ça que j'ai fait travailler le mien avec un projet déjà construit.

  1. Copiez tous les fichiers XML hors de votre répertoire de mise en page, et placez-les dans un répertoire sur le bureau ou quelque chose pour la sauvegarde.
  2. Supprimer tout le répertoire de mise en page (Assurez-vous d'avoir tout sauvegardé à partir de l'étape 1 !!!)
  3. Cliquez avec le bouton droit sur le répertoire res et sélectionnez nouveau> répertoire.
  4. Nommez ce nouveau répertoire "layouts". (Cela peut être ce que vous voulez, mais ce ne sera pas un répertoire 'fragment' ou un répertoire 'activity', qui viendra plus tard).
  5. Cliquez avec le bouton droit sur le nouveau répertoire "layouts" et sélectionnez new> directory. (Ce sera le nom du type de fichiers XML que vous y trouverez, par exemple, 'fragments' et 'activités').
  6. Cliquez avec le bouton droit de la souris sur le répertoire 'fragment' ou 'activities' (Remarque: il ne doit pas nécessairement s'agir de 'fragment' ou 'activités') et sélectionnez new> directory pour nommer ce répertoire. "disposition". (Remarque: Ceci DOIT être nommé "layout" !!! très important).
  7. Placez les fichiers XML que vous voulez dans le nouveau répertoire 'layout' de la sauvegarde que vous avez faite sur votre bureau.
  8. Répétez les étapes 5 à 7 pour autant de répertoires personnalisés que vous le souhaitez.
  9. Une fois cette opération terminée, allez dans le fichier gradle.build de vos modules et créez une définition de sourceSets comme celle-ci ... !! Comme je montre ci-dessous).

    sourceSets {
        main {
            res.srcDirs =
                    [
                            'src/main/res/layouts/activities',
                            'src/main/res/layouts/fragments',
                            'src/main/res/layouts/content',
                            'src/main/res/layouts',
                            'src/main/res'
                    ]
        }
    }
    
  10. Bénéfice $$$$

Mais sérieusement .. c'est comme ça que je l'ai fait fonctionner. Faites-moi savoir si quelqu'un a des questions .. Je peux essayer d'aider.

Les images valent plus que les mots.

Directory Structure


71
2017-08-25 03:12



Pas possible, mais le dossier de disposition est trié par nom. Donc, je préfixer les noms de fichiers de mise en page avec mes noms de paquets. Par exemple. pour les deux paquets "acheter" et "jouer":

buying_bought_tracks.xml
buying_buy_tracks.xml
playing_edit_playlist.xml
playing_play_playlist.xml
playing_show_playlists.xml

50
2017-10-21 23:19



Maintenant, avec Android Studio et Gradle, vous pouvez avoir plusieurs dossiers de ressources dans votre projet. Permettant d'organiser non seulement vos fichiers de mise en page mais tout type de ressources.

Ce n'est pas exactement un sous-dossier, mais peut séparer des parties de votre application.

La configuration est comme ceci:

sourceSets {
    main {
        res.srcDirs = ['src/main/res', 'src/main/res2']
    }
}

Vérifier la Documentation.


18
2018-02-04 13:38



j'utilise Groupement de fichiers Android plugin pour Android Studio.Il ne vous permet pas vraiment de créer des sous-dossiers, mais il peut AFFICHER vos fichiers et ressources AS qu'ils sont dans des dossiers différents. Et c'est exactement ce que je voulais.

Vous pouvez installer le plug-in "Android File Grouping" par

Les fenêtres:

Android Studio -> Fichier -> Paramètres -> Plugins.

Mac:

Android Studio -> onglet Android Studio (en haut à gauche) -> Préférences -> Plugins -> Installer JetBrains Plugin ..

Pour Mac, j'ai pu le tester et je n'ai pas pu rechercher le plugin. J'ai donc téléchargé le plugin depuis ici et utilisé le Install plugin from disk option du réglage ci-dessus.


18
2017-08-28 06:59



Je pense que la solution la plus élégante à ce problème (étant donné que les sous-dossiers ne sont pas autorisés) est de préfixer les noms de fichiers avec le nom du dossier dans lequel vous l'auriez placé. Par exemple, si vous avez un ensemble de dispositions pour une activité, un fragment ou simplement une vue générale appelée "places", vous devez simplement la placer avec places_my_layout_name. Au moins cela résout le problème de les organiser de manière à ce qu'ils soient plus faciles à trouver dans l'EDI. Ce n'est pas la solution la plus géniale, mais c'est mieux que rien.


16
2018-06-05 02:41



Petit problème

Je suis en mesure d'atteindre les sous-dossiers en suivant la meilleure réponse à cette question.

Cependant, à mesure que le projet s'agrandit, vous aurez de nombreux sous-dossiers:

sourceSets {
    main {
        res.srcDirs =
            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]
    }
}

Pas un gros problème, mais:

  • ce n'est pas joli car la liste devient très longue.
  • vous devez changer votre app/build.gradle chaque fois que vous ajoutez un nouveau dossier.

Amélioration

J'ai donc écrit une méthode Groovy simple pour saisir tous les dossiers imbriqués:

def getLayoutList(path) {
    File file = new File(path)
    def throwAway = file.path.split("/")[0]
    def newPath = file.path.substring(throwAway.length() + 1)
    def array = file.list().collect {
        "${newPath}/${it}"
    }
    array.push("src/main/res");
    return array
}

Collez cette méthode en dehors du android {...} bloquer dans votre app/build.gradle.


Comment utiliser

Pour une structure comme celle-ci:

<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

Utilisez-le comme ceci:

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("app/src/main/res/layouts/")
        }
    }
}

Si vous avez une structure comme celle-ci:

<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

Vous l'utiliserez comme ceci:

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
        }
    }
}

Explication

getLayoutList() prend a relative path comme argument. le relative path est relatif à la racine du projet. Donc, quand nous entrons "app/src/main/res/layouts/", il retournera le nom de tous les sous-dossiers en tant que tableau, qui sera exactement le même que:

            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]

Voici le script avec des commentaires pour comprendre:

def getLayoutList(path) {
    // let's say path = "app/src/main/res/layouts/
    File file = new File(path)

    def throwAway = file.path.split("/")[0]
    // throwAway = 'app'

    def newPath = file.path.substring(throwAway.length() + 1) // +1 is for '/'
    // newPath = src/main/res/layouts/

    def array = file.list().collect {
        // println "filename: ${it}" // uncomment for debugging
        "${newPath}/${it}"
    }

    array.push("src/main/res");
    // println "result: ${array}" // uncomment for debugging

    return array
}

J'espère que cela aide!


11
2018-04-29 06:40