2010-05-10 8 views
11

Ich arbeite an einer App für Android mit ein paar anderen Leuten, und der primäre Inhalt wird von unseren Designern als Textdateien in einem bestimmten Dateiformat angegeben, das wir dann analysieren , verarbeiten und servieren Sie in der App. Wir speichern sie derzeit in res/raw.Zugriff auf res/root programmatisch (Android)

Das macht Dinge gut für die Designer, denn wenn sie Inhalte hinzufügen möchten, fügen sie einfach eine Datei res/raw hinzu. Dies ist jedoch als Entwickler ärgerlich, da wir Entwickler dann R.raw.the_new_file zu einem Array im Code hinzufügen müssen, der angibt, welche Dateien beim Start verarbeitet werden sollen.

Gibt es eine Möglichkeit, programmgesteuert auf die Ressourcen-IDs von res/raw zuzugreifen? Im Idealfall, wenn die Anwendung startet, könnten wir einen Aufruf machen, um zu sehen, welche Dateien in res/raw sind, verarbeiten sie alle, so dass wir den kleinen Overhead eliminieren könnten, indem wir den Inhalt von res/raw mit dem unseres Arrays im Code abgleichen.

Der vielversprechendste Weg, den ich gesehen habe, ist getAssets von Resources, die mich list(String) auf dem AssetManager rufen lassen würde, aber ich habe Mühe hatte immer diese zu arbeiten, vor allem, da man nicht direkt "res/raw" als Filepath anrufen (oder zumindest hat es nicht funktioniert, wenn ich versucht habe.

Vorschläge? Vielen Dank

Antwort

15

Sie könnten Reflexion verwenden.


ArrayList<Integer> list = new ArrayList<Integer>(); 
Field[] fields = R.raw.class.getFields(); 
for(Field f : fields) 
try { 
     list.add(f.getInt(null)); 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { } 

Danach enthält diese Liste alle Ressourcen-IDs im Ordner res/raw. Wenn Sie den Namen der Ressource benötigen ... f.getName() gibt es zurück.

+0

Danke, spät zu akzeptieren, aber ich hatte vergessen, dass ich nicht hatte. Lief wie am Schnürchen! –

1

Sie

verwenden könnten
Context.getResources().getIdentifier("filename", "raw", "packagename"); 

die entsprechenden i zu erhalten Zahnpasta. aber ich verstehe nicht, warum Sie Ihre Lösung so kompliziert implementieren? Was sind die Vorteile für den Designer? Warum legen sie die Dateien nicht einfach in einen drückbaren Ordner?

+0

Dies ist eigentlich nicht für Grafiken, sondern für Ebenen in einem Spiel. Jede Ebene hat eine statische Karte, eine variable Anzahl dynamischer Objekte, Orte für diese Objekte, levelspezifische Benachrichtigungen, eine Anzahl von Konfigurationen usw. Anstatt die Level-Designer unsere Codebasis direkt bearbeiten zu lassen, haben wir einen Parser geschrieben, um es ihnen zu ermöglichen Spezifizieren Sie die Ebenen deklarativ in Textdateien; und wir beschlossen, sie in res/rohe zu setzen. Danke für den Tipp! Ich werde es versuchen und Sie wissen lassen, wie es geht^_^ –

5

Diese Antwort kann ein bisschen spät sein, Sie sollten stattdessen Asset-Ordner verwenden. Dort können Sie eine Ordnerhierarchie haben und diese als Dateisystem lesen.

Für Ihre Informationen gibt die getAssets einen Manager für Dateien im Ordner "Assets" Ihres Android-Projekts und nicht in "res/raw" zurück. "res/raw" geht in das Java-Paket "R". assets.list(path) Gibt ein Array von Dateien im angegebenen Ordner relativ zu Ihrem Assets-Ordner zurück. Der Ordner des Assets ist auch kein traditioneller Ordner, aber Android abstrahiert es, so dass es sich wie normale Dateien anfühlt. Dies wird wichtiger, wenn Sie JNI ausführen und Ihre Assets von c/C++ lesen möchten.

Verwandte Themen