628 Stimmen

Können im Android-Layoutordner Unterordner enthalten sein?

Aktuell speichere ich jede XML-Layoutdatei im Ordner 'res/layout', um kleine Projekte einfach und übersichtlich verwalten zu können. Bei großen und umfangreichen Projekten ist jedoch eine Hierarchie und Unterordner im Layout-Ordner erforderlich.

zum Beispiel

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

Auf die gleiche Weise möchten wir Unterordner für die große Anwendung haben, gibt es eine Möglichkeit, dies im Android-Projekt zu tun?

Ich kann Unterordner layout-personal und layout_adress innerhalb des layout-Ordners erstellen, aber wenn es darum geht, auf die XML-Layoutdatei mit R.layout._______ zuzugreifen, wird keine XML-Layoutdatei im Menü angezeigt.

0 Stimmen

0 Stimmen

Ich denke, dieser Link könnte Ihnen weiterhelfen. blog.mindorks.com/…

21voto

I'm a frog dragon Punkte 7200

Kleines Problem

Es gelingt mir, Unterordner zu erreichen, indem ich der Top-Antwort auf diese Frage folge.

Es besteht jedoch darin, dass das Projekt wächst, viele Unterordner haben:

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/...viele mehr',
            'src/main/res'
        ]
    }
}

Nicht ein großes Problem, aber:

  • Es ist nicht hübsch, da die Liste sehr lang wird.
  • Sie müssen jedes Mal Ihr app/build.gradle ändern, wenn Sie einen neuen Ordner hinzufügen.

Verbesserung

Also schrieb ich eine einfache Groovy-Methode, um alle verschachtelten Ordner zu erfassen:

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
}

Fügen Sie diese Methode außerhalb des android {...}-Blocks in Ihrem app/build.gradle ein.


Wie man es benutzt

Für eine Struktur wie diese:

 app <---------- BEACHTEN SIE
 build
 build.gradle
 gradle
 gradle.properties
 gradlew
 gradlew.bat
 local.properties
 settings.gradle

Verwenden Sie es so:

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

Wenn Sie eine Struktur wie diese haben:

 my_special_app_name <---------- BEACHTEN SIE
 build
 build.gradle
 gradle
 gradle.properties
 gradlew
 gradlew.bat
 local.properties
 settings.gradle

Verwenden Sie es so:

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

Erklärung

getLayoutList() nimmt einen relativen Pfad als Argument. Der relative Pfad ist relativ zum Root des Projekts. Wenn wir also "app/src/main/res/layouts/" eingeben, werden alle Unterordnernamen als Array zurückgegeben, was genau das gleiche ist wie:

[
    '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/...viele mehr',
    'src/main/res'
]

Hier ist das Skript mit Kommentaren zur Verständlichkeit:

def getLayoutList(path) {
    // nehmen wir an, 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 ist für '/'
    // newPath = src/main/res/layouts/

    def array = file.list().collect {
        // println "Dateiname: ${it}" // zum Debuggen nicht kommentieren
        "${newPath}/${it}"
    }

    array.push("src/main/res");
    // println "Ergebnis: ${array}" // zum Debuggen nicht kommentieren

    return array
}

Hoffentlich hilft es!

0 Stimmen

Ich habe deinen Ansatz verwendet, aber wie verwende ich ihn in der Aktivität? Ich habe einen Unterordner im Layouts-Ordner namens admin erstellt und es gibt ein admin_home-Layout. Wenn ich in der Aktivität bin und setContentView(R.layout.Admin.admin_home) verwende, wird Admin.admin_home nicht aufgelöst.

0 Stimmen

Sie sollten es normal verwenden können, wie R.layout.admin_home. Das Skript sollte in der Lage sein, die Namen automatisch für Sie zu übernehmen. Lassen Sie mich wissen, ob es funktioniert.

0 Stimmen

Es funktioniert gut, aber nachdem diese Zeile geändert wurde array.push("src/main/res"); zu def res="src/main/res"; array.push(res); Denn ich habe einen Fehler, da push einen Gstring-Parameter benötigt, nicht einen String. Wenn jemand außer mir diesen Fehler findet, kann er ihn bearbeiten.

20voto

botbot Punkte 7038

Ich denke, die eleganteste Lösung für dieses Problem (vorausgesetzt, Unterordner sind nicht erlaubt) ist, den Dateinamen mit dem Namen des Ordners zu versehen, in dem Sie es platziert hätten. Wenn Sie beispielsweise eine Reihe von Layouts für eine Aktivität, ein Fragment oder einfach nur eine allgemeine Ansicht namens "Orte" haben, sollten Sie es einfach mit places_my_layout_name versehen. Zumindest löst dies das Problem, sie auf eine Weise zu organisieren, dass sie im IDE leichter zu finden sind. Es ist nicht die beste Lösung, aber es ist besser als nichts.

18voto

Androiderson Punkte 15995

Jetzt können Sie mit Android Studio und Gradle mehrere Ressourcenordner in Ihrem Projekt haben. Sie können nicht nur Ihre Layoutdateien, sondern alle Arten von Ressourcen organisieren.

Es ist nicht genau ein Unterordner, aber kann Teile Ihrer Anwendung trennen.

Die Konfiguration sieht so aus:

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

Überprüfen Sie die Dokumentation.

2 Stimmen

Ich habe bemerkt, dass jedes Mal, wenn ich Änderungen an einem Layout unter dieser Einstellung vorgenommen habe, musste ich immer ein clean durchführen, um sie in der App reflektiert zu sehen.

18voto

Santhi Bharath Punkte 2758

Jetzt können wir ganz einfach mit dem JetBrains-Plugin namens "Android-Dateigruppierung" umgehen

Schauen Sie sich diesen Link an

Android-Dateigruppierung

Bildbeschreibung hier eingeben

0 Stimmen

Es muss als richtige Antwort markiert werden, da nur die Gruppierung mit einfacher Namenskonvention organisiert wird. Es ist nicht erforderlich, das Gradle oder sogar die Standardordnerstruktur einer App zu ändern. Alle Layouts bleiben weiterhin im Layout-Ordner, sind jedoch in Android Studio gruppiert.

3 Stimmen

Sollte nicht als die akzeptierte Antwort gelten, weil sie im Android-View nicht funktioniert.... (aber ich liebe die Idee^^)

2 Stimmen

Dies funktioniert nicht für die letzte Version von Android...gibt es eine aktualisierte Version?

13voto

Fonix Punkte 11001

Eine Möglichkeit, dies zu tun, besteht darin, einen separaten "res"-Ordner auf derselben Ebene wie der tatsächliche "res"-Ordner in Ihrem Projekt zu erstellen. Anschließend können Sie dies in Ihrer "build.gradle"-Datei für Apps verwenden.

android {
    //anderer Kram

    sourceSets {
        main.res.srcDirs = ['src/main/res', file('src/main/layouts').listFiles()]
    }
}

Beispiel Ordnerstruktur

Dann kann jeder Unterordner Ihres neuen "res"-Ordners etwas sein, das mit jedem bestimmten Bildschirm oder etwas in Ihrer App in Verbindung steht. Jeder Ordner wird seine eigenen Layout / drawable / values usw. haben, um die Dinge organisiert zu halten. Sie müssen die "build.gradle"-Datei nicht manuell aktualisieren, wie es einige dieser anderen Antworten erfordern (Synchronisieren Sie einfach jedes Mal Ihren Gradle, wenn Sie einen neuen Ressourcenordner hinzufügen, damit er davon weiß, und stellen Sie sicher, dass Sie die relevanten Unterordner hinzufügen, bevor Sie Ihre XML-Dateien hinzufügen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X