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.

War es hilfreich?

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

Eigentlich auf Android Studio ist es möglich. Sie haben können Ressourcen verschachtelt wie gezeigt hier :

 image description hier

Es gibt auch ein Plugin, um Gruppenressourcen hier .

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

eingeben Bild Beschreibung hier

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 { }).

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.

  1. Rechtsklick auf Drawable
  2. Wählen Sie Neu ---> Verzeichnis
  3. Geben Sie den Namen des Verzeichnisses. ZB: logo.png (der Ort wird den ziehbar Ordner standardmäßig bereits zeigen)
  4. 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
  5. Machen Sie dasselbe für die restlichen Bilder. Alle von ihnen werden unter dem logo.png Hauptordner abgelegt werden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top