2010-05-10 9 views
11

Pracuję nad aplikacją dla systemu Android z kilkoma innymi osobami, a główna treść jest określana przez naszych projektantów jako pliki tekstowe w określonym formacie pliku, który następnie analizujemy. , przetwarzaj i wyświetlaj w aplikacji. Aktualnie przechowujemy je w res/raw.Dostęp do zawartości programu res/raw programowo (Android)

To sprawia, że ​​rzeczy są idealne dla projektantów, ponieważ gdy chcą dodać treść, po prostu dodają plik do res/raw. Jest to jednak denerwujące, ponieważ programiści muszą dodać R.raw.the_new_file do tablicy w kodzie określającym, które pliki mają zostać przetworzone podczas uruchamiania.

Czy istnieje sposób, aby programowo uzyskać dostęp do identyfikatorów zasobów res/raw? Idealnie, gdy aplikacja się uruchomi, możemy wykonać wywołanie, aby zobaczyć, które pliki są w res/raw, przetworzyć je wszystkie, abyśmy mogli wyeliminować małe obciążenie, dopasowując zawartość res/raw do zawartości naszej tablicy w kodzie.

Najbardziej obiecującą ścieżką Widziałem to getAssets z Resources, który pozwolił mi zadzwonić list(String) na AssetManager, ale miałem problemy z uzyskaniem tej pracy, zwłaszcza, że ​​nie można wywołać bezpośrednio "res/raw" jako filePath (lub przynajmniej, że nie pracował, kiedy próbowałem.

sugestie? Dzięki

Odpowiedz

15

Możesz użyć refleksji.


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

Po tej liście są przechowywane wszystkie identyfikatory zasobów w folderze res/raw. Jeśli potrzebujesz nazwy zasobu ... f.getName() zwraca ją.

+0

Dzięki, późno, by zaakceptować, ale zapomniałem, że nie. Pracował jak urok! –

1

można użyć

Context.getResources().getIdentifier("filename", "raw", "packagename"); 

aby uzyskać odpowiednią I Dentyści. jednak nie rozumiem, dlaczego wdrażasz swoje skomplikowane rozwiązanie? jakie są zalety dla projektanta? dlaczego nie umieszczają plików w folderze do rysowania?

+0

W rzeczywistości nie dotyczy to grafiki, ale poziomów w grze. Na każdym poziomie znajduje się mapa statyczna, zmienna liczba obiektów dynamicznych, lokalizacje tych obiektów, powiadomienia o poziomie szczegółowości, liczba konfiguracji itp. Zamiast edytować edytory kodu bezpośrednio przez naszych projektantów, napisaliśmy parser, aby umożliwić im określaj deklaratywnie poziomy w plikach tekstowych; i zdecydowaliśmy się umieścić je w res/raw. Dzięki za cynk! Spróbuję i dam ci znać, jak to działa^_^ –

5

Ta odpowiedź może być nieco spóźniona, należy zamiast tego użyć folderu zasobów. Tam możesz mieć hierarchię folderów i odczytać ją jako system plików.

Dla Twojej informacji getAssets zwraca menedżera plików w folderze "zasoby" projektu Android, a nie w "res/raw". "res/raw" przechodzi do Pakietu Java "R". assets.list(path) Powoduje zwrócenie tablicy plików w danym folderze względem folderu zasobów. Folder zasobu również nie jest folderem tradycyjnym, ale Android go streszcza, aby "czuł się" jak zwykłe pliki. Staje się to ważniejsze, jeśli robisz JNI i chcesz czytać zasoby z c/C++.

Powiązane problemy