2010-09-06 22 views
29

Jak to zrobić:Dynamic Resource Loading Android

Próbuję znaleźć sposób na otwarcie zasobów, których nazwa jest określona tylko w środowisku wykonawczym.

Pozwól mi wyjaśnić więcej szczegółów

chcę mieć XML odwołujący kilka innych plików XML w apk aplikacji.

W celu wyjaśnienia powiedzmy, że głównym XML jest main.xml, a drugi XML to file1.xml file2.xml, fileX.xml.

Co chcę, to przeczytaj plik main.xml, na przykład wypakuj nazwę żądanego pliku XML (fileX.xml). A następnie przeczytaj plik FileX.XML.

Problemem jest to, że mam twarz co wyodrębnić postać main.xml jest ciągiem i nie mogę znaleźć sposób, by to zmienić, aby R.raw.nameOfTheFile

Ktoś ma pomysł?

ja nie chce:

  • przegrupować wszystko w jednym wielkim pliku XML
  • hardcode main.xml w ogromnym przypadku przełącznika, który łączy numer/string do identyfikatora zasobów
+0

Mam do czynienia z podobnym problemem, ale nie otrzymuję żadnej akceptowanej odpowiedzi. Czy ktokolwiek może zdobyć nagrodę za to pytanie? –

Odpowiedz

51

nie używałem go z surowych plików lub plików XML szablonu, ale dla kanału alfa używam tego:

getResources().getIdentifier("fileX", "drawable","com.yourapppackage.www"); 

, aby uzyskać identyfikator (R.id) zasobu. Konieczne będzie zastąpienie drawable czymś innym, może raw lub layout (untested).

+0

Dzięki za odpowiedź, która działa świetnie. Dla osób w tym samym przypadku [tutaj jest dobre wytłumaczenie na ten temat] (http://www.anddev.org/tinytut_-_get_resources_by_name__getidentifier_-t460.html) (gdy miałem już nazwę funkcji, która była prosta): ' getResources(). getIdentifier ("fileX", "raw", pakiet aplikacji); " –

+1

Dead link? @JasonRogers Ah, nvm - powinien to być http://www.anddev.org/tinytut_-get_resources_by_name__getidentifier-t460.html – aaronsnoswell

+1

nie martwy link casperOne usunął mój post i zmienił go na komentarz bez poświęcania czasu na zrobienie tego poprawnie (aka uszkodzony link) tutaj jest link: http://www.anddev.org/tinytut_-_get_resources_by_name__getidentifier_-t460.html –

23

Napisałem tę metodę mało poręczny pomocnika do enkapsulacji to:

public static String getResourceString(String name, Context context) { 
    int nameResourceID = context.getResources().getIdentifier(name, "string", context.getApplicationInfo().packageName); 
    if (nameResourceID == 0) { 
     throw new IllegalArgumentException("No resource string found with name " + name); 
    } else { 
     return context.getString(nameResourceID); 
    } 
} 
+0

Bardzo przydatne, dziękuję, ale nigdy nie chcielibyśmy napisu. czasem strumień byłby lepszy. –

6

istnieje inna metoda:

int drawableId = R.drawable.class.getField("file1").getInt(null); 

Według this blog to 5x razy szybciej niż przy użyciu getIdentifier.