Im Moment speichere ich jede XML-Layoutdatei im res/layout
Ordner, so dass es machbar und einfach ist, kleine Projekte zu verwalten. Wenn es sich jedoch um große und schwere Projekte handelt, sollten eine Hierarchie und Unterordner erforderlich sein den Layoutordner.
für zB
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 also eine Möglichkeit, dies innerhalb des Android-Projekts zu tun?
Ich kann Layout-Personal- und Layout_Adresse-Unterordner innerhalb des Layout-Ordners erstellen. Wenn jedoch der Zeitpunkt für den Zugriff auf die XML-Layoutdatei mit R.layout ._______ gekommen ist, befindet sich zu diesem Zeitpunkt kein XML-Layout-Popup im Speisekarte.
android
android-layout
Paresh Mayani
quelle
quelle
Antworten:
Sie können dies mit Gradle tun. Ich habe ein Demo-Projekt gemacht, das zeigt, wie.
Der Trick besteht darin, die Fähigkeit von gradle zu nutzen, mehrere Ressourcenordner zusammenzuführen und den res-Ordner sowie die verschachtelten Unterordner im sourceSets-Block festzulegen.
Die Besonderheit ist, dass Sie einen Containerressourcenordner nicht deklarieren können, bevor Sie die untergeordneten Ressourcenordner dieses Ordners deklariert haben.
Unten finden Sie den Block sourceSets aus der Datei build.gradle aus der Demo. Beachten Sie, dass die Unterordner zuerst deklariert werden.
Außerdem muss das direkte übergeordnete Element Ihrer tatsächlichen Ressourcendateien (PNGs, XML-Layouts usw.) weiterhin der Spezifikation entsprechen .
quelle
R.layout.list_item
aus demmovies
oder demcinemas
Ordner stammt, sodass die flache Benennung weiterhin gilt.build:gradle:0.14.4
und nichtbuildToolsVersion "21.1.1"
.URI is not registered
Problem.Die Antwort ist nein.
Ich möchte Ihre Aufmerksamkeit auf dieses Buch Pro Android 2 lenken , in dem es heißt:
quelle
raw
als Ressourcen dichte / orientierung / version / etc abhängige Streifen erhalten, währendassets
Sie dies manuell tun müssen.Ich wollte nur die fantastische Antwort von eskis für Leute, die Probleme haben, ergänzen. (Hinweis: Dies funktioniert nur und sieht aus wie separate Verzeichnisse in der Projektansicht, leider nicht in der Android-Ansicht.)
Getestet mit folgendem. BuildToolsVersion = 23.0.0 Gradle 1.2.3 & 1.3.0
So habe ich meine dazu gebracht, mit einem bereits erstellten Projekt zu arbeiten.
Sobald dies abgeschlossen ist, gehen Sie in die Datei gradle.build Ihres Moduls und erstellen Sie eine sourceSets-Definition wie diese ... (Stellen Sie sicher, dass 'src / main / res / layouts' und 'src / main / res' immer die beiden unteren sind !! !! Wie ich unten zeige).
Gewinn $$$$
Aber im Ernst ... so habe ich es zum Laufen gebracht. Lassen Sie mich wissen, wenn jemand Fragen hat. Ich kann versuchen zu helfen.
Bilder sind mehr wert als Worte.
quelle
layout-v21
?'src/main/res/layouts/content'
und der Pfad dieser Konfiguration ist'src/main/res/layouts/content/layout'
Nicht möglich, aber der Layoutordner ist nach Namen sortiert. Daher stelle ich den Namen der Layoutdateien meine Paketnamen voran. ZB für die beiden Pakete "Kaufen" und "Spielen":
quelle
Ich verwende das Android File Grouping Plugin für Android Studio. Es ermöglicht Ihnen nicht wirklich das Erstellen von Unterordnern, aber es kann Ihre Dateien und Ressourcen so anzeigen, wie sie sich in verschiedenen Ordnern befinden. Und genau das wollte ich.
Sie können das Plugin "Android File Grouping" von installieren
Windows:
Mac:
Für Mac konnte ich es testen und nicht nach dem Plugin suchen. Also habe ich das Plugin von hier heruntergeladen und die
Install plugin from disk
Option aus der obigen Einstellung verwendet.quelle
Mit Android Studio und Gradle können Sie jetzt mehrere Ressourcenordner in Ihrem Projekt haben. So können Sie nicht nur Ihre Layoutdateien, sondern auch alle Arten von Ressourcen organisieren.
Es ist nicht gerade ein Unterordner, kann aber Teile Ihrer Anwendung trennen.
Die Konfiguration ist wie folgt:
Überprüfen Sie die Dokumentation .
quelle
clean
zu sehen, wie es sich in der App widerspiegelt.Ich denke, die eleganteste Lösung für dieses Problem (da Unterordner nicht zulässig sind) besteht darin, den Dateinamen den Namen des Ordners voranzustellen, in dem Sie ihn abgelegt hätten. Wenn Sie beispielsweise eine Reihe von Layouts für eine Aktivität, ein Fragment oder eine allgemeine Ansicht mit dem Namen "Orte" haben, sollten Sie sie einfach mit "Plätze_mein_Layout_name" voranstellen. Zumindest löst dies das Problem, sie so zu organisieren, dass sie in der IDE leichter zu finden sind. Es ist nicht die tollste Lösung, aber es ist besser als nichts.
quelle
Kleines Problem
Ich kann Unterordner erreichen, indem ich der Top-Antwort auf diese Frage folge .
Wenn das Projekt jedoch größer wird, haben Sie viele Unterordner:
Kein großes Problem, aber:
app/build.gradle
jedes Mal ändern, wenn Sie einen neuen Ordner hinzufügen.Verbesserung
Also habe ich eine einfache Groovy-Methode geschrieben, um alle verschachtelten Ordner abzurufen:
Fügen Sie diese Methode außerhalb des
android {...}
Blocks in Ihre einapp/build.gradle
.Wie benutzt man
Für eine Struktur wie diese:
Verwenden Sie es so:
Wenn Sie eine Struktur wie diese haben:
Sie werden es so verwenden:
Erläuterung
getLayoutList()
nimmta relative path
als Argument. Dasrelative path
ist relativ zur Wurzel des Projekts. Wenn wir also etwas eingeben"app/src/main/res/layouts/"
, wird der Name aller Unterordner als Array zurückgegeben, was genau dem entspricht:Hier ist das Skript mit Kommentaren zum Verständnis:
Ich hoffe es hilft!
quelle
setContentView(R.layout.Admin.admin_home .)
Admin.admin_home verwende. Es wurde nicht aufgelöstR.layout.admin_home
. Das Skript sollte in der Lage sein, die Namen automatisch für Sie zu erfassen. Lassen Sie mich wissen, ob Sie es zum Laufen bringen können.array.push("src/main/res");
indef res="src/main/res";
array.push(res);
geändert habe , weil ich einen Fehler als Push-Gstring-Parameter habe, nicht String Eins. Wenn jemand anderes als ich diesen Fehler gefunden hat, können Sie ihn bearbeiten// uncomment for debugging
und dann überprüfen, ob die Ausgängesrc/main/res/layouts/<your_layout_files>
richtig erkannt wurden?Jetzt können wir ganz einfach mit dem JetBrains-Plugin " Android File Grouping " arbeiten.
Schauen Sie sich diesen Link an
Android-Dateigruppierung
quelle
Android Studio
Eine Möglichkeit, wie ich es getan habe, bestand darin, einen separaten Res-Ordner auf derselben Ebene wie der eigentliche Res-Ordner in Ihrem Projekt zu erstellen. Dann können Sie diesen in Ihren Apps build.gradle verwenden
Dann kann jeder Unterordner Ihres neuen Res-Ordners etwas sein, das sich auf einen bestimmten Bildschirm oder etwas in Ihrer App bezieht, und jeder Ordner hat seine eigenen
layout
/drawable
/values
etc, um die Organisation zu gewährleisten, und Sie müssen die Gradle-Datei nicht wie einige dieser anderen manuell aktualisieren Antworten erforderlich (Synchronisieren Sie Ihren Gradle einfach jedes Mal, wenn Sie einen neuen Ressourcenordner hinzufügen, damit er davon erfährt, und stellen Sie sicher, dass Sie die entsprechenden Unterordner hinzufügen, bevor Sie Ihre XML-Dateien hinzufügen).quelle
Prüfen Bash Flatten Ordner Skript , dass Konvertiten Ordner - Hierarchie in einem einzelnen Ordner
quelle
Wenn Sie unter Linux oder einer Mac-Box entwickeln, besteht eine Problemumgehung darin, Unterordner zu erstellen, die symbolische Links zu Ihren Layoutdateien enthalten. Verwenden Sie einfach den Befehl ln mit -s
Das Problem dabei ist, dass Ihr Layout-Ordner immer noch alle XML-Dateien enthält. Sie können sie jedoch mithilfe der Unterordner auswählen. Es ist das Nächste, was Sie gerne hätten.
Ich habe gerade gelesen, dass dies auch unter Windows funktionieren könnte, wenn Sie Vista oder höher verwenden. Es gibt diesen
mklink
Befehl. Google es einfach, habe es selbst noch nie benutzt.Ein weiteres Problem ist, wenn Sie die Datei geöffnet haben und versuchen, sie erneut zu öffnen, löst das Plugin eine NULL Pointer Exception aus. Aber es legt nicht auf.
quelle
Obwohl alle Vorschläge für mehrere Ressourcensätze möglicherweise funktionieren, besteht das Problem darin, dass die aktuelle Logik für das Android Studio Gradle-Plug-In die Ressourcendateien nicht aktualisiert, nachdem sie für verschachtelte Ressourcensätze geändert wurden. Die aktuelle Implementierung versucht, die Ressourcenverzeichnisse mit startWith () zu überprüfen, sodass eine verschachtelte Verzeichnisstruktur (dh src / main / res / layout / layouts und src / main / res / layout / layouts_category2) src / main / res auswählt / layout / layouts konsistent und aktualisieren Sie die Änderungen nie. Das Endergebnis ist, dass Sie das Projekt jedes Mal neu erstellen / bereinigen müssen.
Ich habe einen Patch unter https://android-review.googlesource.com/#/c/157971/ eingereicht, um zu versuchen, Probleme zu lösen.
quelle
Die Top-Antwort von @eski ist gut, aber der Code ist nicht elegant zu verwenden, deshalb habe ich ein grooviges Skript in Gradle für den allgemeinen Gebrauch geschrieben. Es wird auf alle Build-Typen und Produktvarianten angewendet und kann nicht nur für das Layout verwendet werden, sondern Sie können auch einen Unterordner für jeden anderen Ressourcentyp hinzufügen, z. B. zum Zeichnen. Hier ist der Code (in einen
android
Block der Gradle-Datei auf Projektebene einfügen):Wie geht das in der Praxis?
Zum Beispiel möchte ich Unterordner mit dem Namen erstellen
activity
fürlayout
, fügen Sie eine Zeichenfolge , die von einem beliebigen Namen inresDirs
Variable wielayouts
sollte, dann ist das Layout XML - Datei in sein setzenres\layouts\activity\layout\xxx.xml
.Wenn ich will , Unterordner mit dem Namen erstellen
selectors
fürdrawable
eine Zeichenfolge , die von einem beliebigen Namen in hinzufügenresDirs
Variable wiedrawables
, dann ist die ziehbar XML - Datei setzt in sein sollteres\drawables\selectors\drawable\xxx.xml
.Der Ordnername wie
layouts
unddrawables
ist in einerresDirs
Variablen definiert . Es kann sich um eine beliebige Zeichenfolge handeln. Alle von Ihnen erstellten Unterordner wieactivity
oderselectors
werden als gleich wieres
Ordner angesehen. Imselectors
Ordner müssen wir also zusätzlich einendrawable
Ordner erstellen und XML-Dateien in dendrawable
Ordner legen. Danach kann gradle die XML-Dateien als normal zeichnbar erkennen.quelle
Wenn Sie die Methode in der genehmigten Antwort verwenden und sie ein wenig verbessern möchten, ändern Sie die Gradle-Einstellung wie folgt:
Wenn Sie also weitere Ordner und Layouts hinzufügen, müssen Sie nicht hierher zurückkehren und eine lange Liste von Quellordnern anhängen. Lassen Sie gradle alle Ordner für Sie abrufen.
quelle
quelle
Project
Modus. Ich konnte nicht verstehen, wo Unterordner verschwunden sind (imAndroid
Modus).Die kurze Antwort lautet nein. Sie können aber definitiv mehrere
res
Ordner haben. Ich denke, das ist so nah wie möglich an Unterordnern für denlayout
Ordner. Hier ist , wie Sie es tun.quelle
Top-Antworten haben mehrere Nachteile: Sie müssen neue Layoutpfade hinzufügen, AS legt statt Ressourcen neue Ressourcen in
res\layouts
Ordner abres\values
.Ich habe mehrere Antworten kombiniert und ähnlich geschrieben:
Ich habe Ordner mit diesem Artikel erstellt: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ . Um Unterordner zu erstellen, sollten Sie dieses Menü verwenden: Neu> Ordner> Res-Ordner.
AKTUALISIEREN
Nach ein paar Wochen stellte ich fest, dass Änderungen an Ressourcen von Android Studio nicht bemerkt werden . Es treten also einige seltsame Fehler auf. Beispielsweise zeigen Layouts weiterhin alte Größen und Ränder. Manchmal findet AS keine neuen XML-Dateien (insbesondere zur Laufzeit). Manchmal mischt es
view id
s (Verweise auf eine andere XML-Datei). Es ist oft erforderlich,Build > Clean Project
oder zu drückenBuild > Rebuild Project
. Lesen Sie die erforderliche Neuerstellung, nachdem Sie die XML-Layoutdateien in Android Studio geändert haben .quelle
res
Ordner zurück, da AS die Aufteilung von Ressourcen in Ordner nicht vollständig unterstützt. Wahrscheinlich werde ich diese Antwort ändern oder sogar löschen. Aber was meinen Sie damit, wenn Sie sagen, dass es kein akzeptabler Weg ist, hier auf SO Lösungen anzubieten?Unterverzeichnisse können nicht (einfach) vorhanden sein, Sie können jedoch zusätzliche Ressourcenordner haben. Überrascht erwähnte es noch niemand, aber um die Standardressourcenordner beizubehalten und weitere hinzuzufügen:
quelle