Kann die Android ziehbar Verzeichnis Verzeichnisse enthalten?
-
21-08-2019 - |
Frage
In der Android-SDK-Dokumentation, alle Beispiele mit der @ ziehbar / my_image XML-Syntax verwendet, um direkt Bilder adressieren, die in dem res / ziehbar Verzeichnis in meinem Projekt gespeichert werden.
Ich frage mich, wenn es ausdrücklich nicht in Ordnung ist, ein Unterverzeichnis innerhalb des ziehbar Verzeichnis zu erstellen.
Zum Beispiel, wenn ich die folgenden Verzeichnisstruktur habe:
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
Kann ich das Bild eines Thunfisch-Salat-Sandwich Referenz als @ ziehbar / Sandwiches / tunaOnRye
Oder muss ich die Hierarchie flach im ziehbar Verzeichnis zu halten haben.
Lösung
Nein, die Ressourcen Mechanismus nicht Unterordner im ziehbar Verzeichnis unterstützen, also ja -. Sie müssen dafür sorgen, dass Hierarchie flach
Die Verzeichnisstruktur Sie zeigte in keinem der Bilder zur Verfügung stehen würde.
Aus meinen eigenen Experimenten scheint es, dass in es mit Gegenständen einen Unterordner mit, im res/drawable
Ordner, wird die Ressource-Compiler fehlschlagen -. Die R.java
Datei verhindert korrekt erzeugt wird,
Andere Tipps
Die Abhilfe Ich verwende (und die ein Android selbst scheint zu bevorzugen) ist im Wesentlichen ein Unterstrich für einen Schrägstrich zu ersetzen, so dass Ihre Struktur wie folgt aussehen würde:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
Der Ansatz erfordert, dass Sie in Ihrem Namen akribisch zu sein und macht es nicht viel einfacher, die Dateien zanken sich (wenn Sie sich entschieden, dass die Getränke und Sandwiches sollen alle wirklich „food
“ sein, würden Sie haben eine Masse zu tun umbenennen, anstatt sie einfach in das Verzeichnis zu bewegen); aber Ihre Programmierlogik der Komplexität leidet nicht zu schlecht im Vergleich zu der Ordnerstruktur äquivalent.
Diese Situation saugt in der Tat. Android ist eine bunte Mischung von wunderbaren und schrecklichen Design-Entscheidungen. Wir können nur hoffen, für letztere Abschnitt mit der gebotenen Eile zu bekommen ausgemerzt:)
Ja -. Es ist saugen :) Allerdings können Sie die Assets Ordner verwenden und Unterverzeichnisse in dort und laden Bilder, die Art und Weise
Mit Assets Ordner.
Beispielcode:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
Ich habe geschrieben eine Eclipse-Plugin, die durch die Trennung der Dateinamen mit zwei Unterstrichen __
virtuelle Unterordner erstellen kann. Das Projekt ist in frühen Stadien, aber keine Sorge, es wird nicht Ihre IDE abstürzen
Weitere Details finden Sie hier, können Sie Pull-Anforderungen gabeln und senden:
https://github.com/kirill578/Android-Sorted-Res-Folder
Ich mag ein einfaches Skript verwenden, um eine organisierte Verzeichnisstruktur von Designern, um etwas zur Verfügung gestellt zu glätten, die verwendet werden können, eine R-Datei zu erzeugen.
Ausführen mit Strompfad in ziehbar-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
In Android Studio mit gradle können Sie mehrere Source-Direktoren haben, die Ihnen erlauben, Ressourcen zu trennen. Zum Beispiel:
android {
....
android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
Allerdings müssen die Namen nicht kollidieren, was bedeutet, Sie werden immer noch Namen wie sandwiches_tunaOnRye haben müssen, aber Sie werden einen separaten Abschnitt für alle Ihre Sandwiches haben können.
Auf diese Weise können Sie Ihre Ressourcen in verschiedenen Strukturen (nützlich für die automatische generierte Inhalte wie actionbargenerator) speichern
Ein Weg, um teilweise um das Problem zu umgehen ist die API-Ebene Suffix zu verwenden. Ich benutze res / Layout-v1, res / Layout-v2 usw., um mehrere Teilprojekte im gleichen apk zu halten. Dieser Mechanismus kann für alle Ressourcentypen verwendet werden.
Natürlich kann dies nur dann verwendet werden, wenn Sie API-Ebene über dem res / Layout-v zielen? Sie verwenden.
Auch achten Sie auf den Bug in Android 1.5 und 1.6. Siehe Andoroid Dokumentation über die API-Level-Suffix .
Mit dem Aufkommen des Bibliothekssystems, eine Bibliothek pro großen Satz von Vermögenswerten zu schaffen könnte eine Lösung sein.
Es ist immer noch problematisch, da man die gleichen Namen innerhalb aller Vermögenswerte mit vermeiden muss aber ein Präfix Schema pro Bibliothek sollte dabei helfen.
Es ist nicht so einfach wie in der Lage, Ordner zu erstellen, aber das hilft halten die Dinge vernünftig ...
Es gibt eine Abhilfe für diese Situation: Sie resVector
erstellen können (zum Beispiel) Ordner auf dem gleichen Niveau wie Standard res
Ordner. Dort können Sie alle drawable-xxx
Ressource Ordner hinzufügen es:
resVector
-drawable
-layout
-color
Danach alles, was Sie brauchen, ist hinzuzufügen,
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
in Ihre build.gradle
Datei (innen android { }
).
Dies ist nicht perfekt Methoden. Sie müssen gleiche Art und Weise implementieren, die Anzeige ist
Nicht von mir, aber ich fand diesen Thread, wenn für dieses Problem suchen, wenn Ihr mit Android Studio und Gradle System beim Aufbau seiner recht einfach keine Plugins notwendig nur ein wenig Build-Datei Bearbeitung
Gradle mit Android Studio könnte es auf diese Weise tun ( link ).
Es ist im Abschnitt „Konfigurieren der Struktur“
sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
einen Ordner im Haupt erstellen. wie: 'res_notification_btn'
und erstellen Ordner-Struktur in. Wie 'ziehbar' oder 'Layout'
dann in 'build.gradle' add this
sourceSets
{
main
{
res
{
srcDirs = ['src/main/res_notification_btn', 'src/main/res']
or
srcDir 'src/main/res_notification_btn'
}
}
}
#!/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?("/")
}
Überprüfen Sie Bash Flatten Ordner Skript die Ordnerhierarchie in einem einzelnen Ordner konvertiert
assets / Sie können es verwenden rohe Asset-Dateien zu speichern. Dateien, die Sie hier speichern werden in eine APK-Datei zusammengestellt, wie sie ist, und der ursprüngliche Dateiname beibehalten wird. Sie können dieses Verzeichnis in der gleichen Art und Weise wie ein typisches Dateisystem URIs navigieren und Dateien als ein Strom von Bytes lesen Sie die Assetmanager verwenden. Zum Beispiel ist dies ein guter Ort für Texturen und Spieldaten. http://developer.android.com/tools/projects/index.html
Subdirectories nicht erlaubt ist, muss die Ressource enthält nur [a-z0-9 _.].
Nein haben Sie Großbuchstaben und keine Schrägstriche.
- Rechtsklick auf Drawable
- Wählen Sie Neu ---> Verzeichnis
- Geben Sie den Namen des Verzeichnisses. ZB: logo.png (der Ort wird den ziehbar Ordner standardmäßig bereits zeigen)
- Kopieren Sie die Bilder direkt in den ziehbar Ordner. Während Einfügen erhalten Sie eine Option MDPI / xhdpi / xxhdpi usw. für jedes der Bilder aus einer Liste zu wählen. Wählen Sie die entsprechende Option und geben Sie den Namen des Bildes. Achten Sie darauf, die gleichen Namen wie der Name des Verzeichnisses halten heißt logo.png
- Machen Sie dasselbe für die restlichen Bilder. Alle von ihnen werden unter dem logo.png Hauptordner abgelegt werden.