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/…

4voto

Sneg Punkte 982

Überprüfen Sie das Bash Flatten Folder Skript, das die Ordnerhierarchie in einen einzelnen Ordner umwandelt

0 Stimmen

Wird es mir bald ansehen. Danke

1 Stimmen

Dieses Skript ändert den Dateinamen so, dass die Verzeichnishierarchie im Dateinamen enthalten ist. Wie wird das mit Ihrem Android-IDE funktionieren, wenn sich die Dateinamen ständig ändern?

4voto

Drusantia Punkte 327

Wenn Sie die Methode in der genehmigten Antwort verwenden und sie ein wenig verbessern möchten, ändern Sie die Gradle-Einstellung wie folgt:

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

Wenn Sie also weitere Ordner und Layouts hinzufügen, müssen Sie nicht hierher zurückkehren und eine lange Liste von Quellordnern anfügen. Lassen Sie Gradle alle Ordner für Sie abrufen.

0 Stimmen

Ja, aber du musst zuerst explizit den Ordner in Gradle auflisten, der erstellt werden soll.

3voto

Darokthar Punkte 993

Wenn Sie auf einem Linux- oder Mac-Computer entwickeln, könnte ein Workaround darin bestehen, Unterordner zu erstellen, die symbolische Links zu Ihren Layoutdateien enthalten. Verwenden Sie einfach den Befehl ln mit -s

ln -s PFAD_ZU_IHRER_DATEI

Das Problem dabei ist, dass Ihr Layoutordner immer noch alle .xml-Dateien enthält. Sie könnten sie jedoch auch auswählen, indem Sie die Unterordner verwenden. Es ist das, was Sie am nächsten an dem haben, was Sie möchten.

Ich habe gerade gelesen, dass dies möglicherweise auch mit Windows funktioniert, wenn Sie Vista oder eine neuere Version nutzen. Es gibt diesen mklink Befehl. Einfach danach googeln, ich habe ihn selbst noch nie benutzt.

Ein weiteres Problem besteht darin, dass, wenn Sie die Datei geöffnet haben und versuchen, sie erneut zu öffnen, der Plugin eine NULL Pointer Exception wirft. Aber er hängt sich nicht auf.

1 Stimmen

Indem man einen symbolischen Link einfügt, wird der Zweck, den Speicher modularisieren zu wollen, indem man Komponenten in verschiedene Unterverzeichnisse aufteilt, untergraben: was es tatsächlich komplexer macht anstatt einfacher. Gradle ermöglicht die Spezifikation von zusätzlichen Ressourcenverzeichnissen.

3voto

Riki Punkte 2705

Die Top-Antwort von @eski ist gut, aber der Code ist nicht elegant zu benutzen, deshalb habe ich ein Groovy-Skript in Gradle für den allgemeinen Gebrauch geschrieben. Es wird auf alle Build-Typen und Produktvarianten angewendet und kann nicht nur für Layouts verwendet werden, sondern Sie können auch Unterordner für andere Ressourcentypen wie drawable hinzufügen. Hier ist der Code (legen Sie ihn in den android-Block der Projekt-Ebene Gradle-Datei)

sourceSets.each {
    def rootResDir = it.res.srcDirs[0]
    def getSubDirs = { dirName ->
        def layoutsDir = new File(rootResDir, dirName)
        def subLayoutDirs = []
        if (layoutsDir.exists()) {
            layoutsDir.eachDir {
                subLayoutDirs.add it
            }
        }
        return subLayoutDirs
    }
    def resDirs = [
            "anims",
            "colors",
            "drawables",
            "drawables-hdpi",
            "drawables-mdpi",
            "drawables-xhdpi",
            "drawables-xxhdpi",
            "layouts",
            "values",
    ]
    def srcDirs = resDirs.collect {
        getSubDirs(it)
    }
    it.res.srcDirs = [srcDirs, rootResDir]
}

Wie setzt man es in die Praxis um?

Zum Beispiel möchte ich einen Unterordner namens activity für layout erstellen, fügen Sie einen beliebigen Namen in die Variable resDirs wie layouts ein, dann sollte die Layout-XML-Datei in res\layouts\activity\layout\xxx.xml platziert werden.

Wenn ich einen Unterordner namens selectors für drawable erstellen möchte, fügen Sie einen beliebigen Namen in die Variable resDirs wie drawables hinzu, dann sollte die Drawable-XML-Datei in res\drawables\selectors\drawable\xxx.xml platziert werden.

Der Ordnernamen wie layouts und drawables ist in der Variablen resDirs festgelegt, er kann beliebig sein. Alle von Ihnen erstellten Unterordner wie activity oder selectors werden wie der res-Ordner behandelt. Also müssen wir im selectors-Ordner zusätzlich einen drawable-Ordner erstellen und die XML-Dateien in den drawable-Ordner einfügen, danach kann Gradle die XML-Dateien normal als drawable erkennen.

0 Stimmen

Dies sollte als die richtige Antwort angesehen werden! Einfach und perfekt funktionierend!

3voto

rogerhu Punkte 101

Während alle Vorschläge für mehrere Ressourcensätze funktionieren können, besteht das Problem darin, dass die aktuelle Logik für das Android Studio Gradle-Plug-In die Ressourcendateien nach Änderungen für verschachtelte Ressourcensätze nicht aktualisiert. Die aktuelle Implementierung versucht, die Ressourcenverzeichnisse mit startsWith() zu überprüfen, sodass eine verschachtelte Verzeichnisstruktur (z. B. src/main/res/layout/layouts und src/main/res/layout/layouts_category2) immer src/main/res/layout/layouts auswählt und die Änderungen nie tatsächlich aktualisiert. Das Ergebnis ist, dass Sie jedes Mal das Projekt neu erstellen/löschen müssen.

Ich habe einen Patch unter https://android-review.googlesource.com/#/c/157971/ eingereicht, um zu versuchen, die Dinge zu lösen.

0 Stimmen

Ich stimme Ihnen zu, dass AS Änderungen in XML-Dateien nicht erkennt. Aber was ist die Lösung? Ich werde es versuchen stackoverflow.com/questions/32317822/….

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