2012-12-22 10 views
8

Chcę, aby lista ciągów występowała w pliku strings.xml.pobierz listę ciągów obecnych w pliku strings.xml w systemie Android

Czy ktoś wie, jak go zdobyć? Jedną z rzeczy, którą odkryłem, jest przypisanie identyfikatorów w porządku sekwencyjnym wewnątrz R.java, ale jak uzyskać identyfikator początkowy nie jest jasne.

Na przykład Mam 100 ciągów znaków w moim strings.xml jak poniżej i chcę odczytywać w czasie nie jak dawanie getResources(). GetString (int id) dla poszczególnych.

<string name="app_label">Calendar</string> 
<string name="what_label">What</string> 
<string name="where_label">Where</string> 
<string name="when_label">When</string> 
<string name="timezone_label">Time zone</string> 
<string name="attendees_label">Guests</string> 
<string name="today">Today</string> 
<string name="tomorrow">Tomorrow</string> 
+0

możesz go uzyskać za pomocą getResources.getString ("twoja_nazwa_strategii"); –

+0

Wiem, ale chcę listę wszystkich ciągów znaków, jeśli używam tej metody, muszę podać identyfikatory wszystkich ciągów znaków, jeśli istnieje 100 ciągów znaków. Muszę napisać to 100 razy. –

+2

Zobacz moją odpowiedź tutaj http://stackoverflow.com/ pytania/13820645/compare-names-of-every-resource-with-the-content-of-a-variable-of-sqlite-databas/13821330 # 13821330 – Luksprog

Odpowiedz

5

Jeśli chcesz uzyskać dostęp do wszystkich ciągów znaków z pliku strings.xml, możesz użyć refleksji na klasie R.string. Przykład można znaleźć w this answer, wystarczy wymienić rysunki za pomocą ciągów.

+0

Dzięki pracy !!! :) –

10

Możesz zadeklarować swoje ciągi w pliku res \ values ​​\ strings.xml w ten sposób.

<string-array name="vehiclescategory_array"> 

     <item>Cars</item> 
     <item>Bikes</item> 
     <item>RVs</item> 
     <item>Trucks</item> 
     <item>Other Vehicles</item> 

</string-array> 

W swojej klasie działalności, można uzyskać do nich dostęp jak poniżej.

String[] categories; 

categories=getResources().getStringArray(R.array.vehiclescategory_array); 

w powyższym wykazie, niezależnie od sekwencji zadeklarować ten sam sposób, w jaki jest przypisany do tablicy w swojej działalności. Załóżmy, że samochody zostaną przypisane do kategorii [0]. Mam nadzieję że to pomoże.

+0

To wygląda dobrze :) ale moim problemem jest to, że mam łańcuchy zdefiniowane już jako pojedyncze elementy w pliku xml i Muszę przeczytać wszystkie te ciągi znaków. –

+0

Dodano więcej wyjaśnień dla Twojego odwołania Appu :) –

+0

Potrzebujesz identyfikatorów ze stringów? Jeśli tak, to czy próbowałeś z getIdentifier()? Ale mógłbym powiedzieć, że jeśli nie używasz tablicy, musisz podać każdą nazwę ciągu w kodzie aktywności, aby uzyskać identyfikator odpowiedniego ciągu, jeśli zrozumiałem cię poprawnie. – Kanth

2

Można zadeklarować tablicę całkowitą z pozycją dla każdego ciągu. Zrobiłem to raz na tablicy kolorów, więc wyobrażam sobie, że działa również na ciągi.

res/wartości/arrays.xml

<integer-array name="app_strings"> 
    <item>@string/app_label</item> 
    <item>@string/what_label</item> 
    <item>@string/where_label</item> 
    <item>@string/when_label</item> 
    <item>@string/timezone_label</item> 
    <item>@string/attendees_label</item> 
    <item>@string/today</item> 
    <item>@string/tomorrow</item> 
</integer-array> 

Następnie w kodzie, prawda pętli nad tablicy i wykorzystywać każdą wartość jako argument getString().

int[] stringIds = getResources().getIntArray(R.array.app_strings); 
String[] strings = new String[stringIds.length]; 
for (int i = 0; i < stringIds.length; i++) { 
    strings[i] = getString(stringIds[i]); 
} 

Problemem jest to, trzeba ręcznie zaktualizować arrays.xml dowolnej chwili zmodyfikować swoje zasoby ciąg, więc to na pewno nie idealny.

5
Field[] fields = R.string.class.getDeclaredFields(); // or Field[] fields = R.string.class.getFields(); 
String str = ""; 
for (int i =0; i < fields.length; i++) { 
    int resId = getResources().getIdentifier(fields[i].getName(), "string", getPackageName()); 
    str += fields[i].getName() + " = "; 
    if (resId != 0) { 
     str += getResources().getString(resId); 
    } 
    str += "\n"; 
} 

Otrzymasz wszystkie kody ciągów z jego wartościami w zmiennej "str".

Powiązane problemy