2010-11-12 16 views
200

Mam preferencje, w których można włączać/wyłączać elementy wyświetlane w menu. Jest 17 przedmiotów. Zrobiłem ciąg znaków w wartościach/arrays.xml z tytułami dla każdego z tych 17 elementów.Odwoływanie się do łańcucha znaków w tablicy łańcuchowej z xml

Mam plik preferencji.xml, który ma układ mojego pliku preferencji, i chciałbym odwołać się do pojedynczego elementu z tablicy łańcuchów, aby użyć go jako tytułu.

Jak mogę to zrobić?

W informatorze dla programistów aplikacji Android widzę, w jaki sposób mogę odwoływać się do pojedynczego ciągu znaków za pomocą XML, ale nie w jaki sposób mogę odwoływać się do łańcucha z zasobu tablicy w XML.

Odpowiedz

284

W skrócie: Nie sądzę, że można, ale wydaje się, że istnieje obejście:.

Jeśli spojrzeć do Android Zasobu tutaj:

http://developer.android.com/guide/topics/resources/string-resource.html

Widzisz niż w sekcji array (array ciąg przynajmniej), przy czym „źródło informacji” (jak otrzymanego od XML) nie określa sposobu adresowania poszczególnych elementów. Możesz nawet wypróbować w swoim XML, aby użyć "@ array/yourarrayhere". Wiem, że w czasie projektowania otrzymasz pierwszy przedmiot. Ale to nie ma sensu, jeśli chcesz użyć, powiedzmy ... drugiego, oczywiście.

JEDNAK, istnieje pewna sztuczka, którą możesz zrobić. Zobacz tutaj:

Referencing an XML string in an XML Array (Android)

można „oszukać” (nie bardzo) definicję tablicy przez adresowanie niezależnych ciągów INSIDE definicji tablicy. Na przykład, w strings.xml:

<string name="earth">Earth</string> 
<string name="moon">Moon</string> 

<string-array name="system"> 
    <item>@string/earth</item> 
    <item>@string/moon</item> 
</string-array> 

za pomocą tego można użyć "@ ciąg/ziemia" i "@ ciąg/moon" normalnie "w android: text" i "android: title" Pola XML, a mimo to nie utracisz możliwości korzystania z definicji tablicy dla celów, które zamierzałeś w pierwszej kolejności.

Wydaje się pracować tutaj na moim Eclipse. Dlaczego nie spróbujesz nam powiedzieć, czy to działa? :-)

+0

Dzięki, to właśnie zrobiłem;) Byłem w trakcie pisania mojej odpowiedzi, kiedy opublikowałeś swoje. Dzięki! – Jorsher

+0

Czy możesz zaakceptować odpowiedź klikając zielony znacznik wyboru? :-P – davidcesarino

+0

A tak przy okazji, nie ma za co. Myślę też, że Android powinien mieć sposób adresowania tablicy w XML bez uciekania się do tego pełnego obejścia.Coś jak "@ array/yourarray (1)" Ale przynajmniej działa. – davidcesarino

175

Może pomogłoby to:

String[] some_array = getResources().getStringArray(R.array.your_string_array) 

Więc masz tablicy-list jako String [], a następnie wybrać dowolną I, some_array [i].

+5

Rozumiem, jak uzyskać zasoby tablicy. To nie pozwala mi jednak odwoływać się do elementu z tablicy w układzie xml. – Jorsher

+1

Ah, przepraszam. Źle zrozumiałem. Cóż, czy to musi być w układzie xml? Jeśli tytuł zmienia się z wyborem użytkownika, dlaczego nie po prostu zrobić to w pliku .java. Na przykład. .setText (some_array [i]). –

+1

Ponieważ układ preferencji jest w formacie xml. Java ładuje menu z elementami, które są "włączone" w preferencjach. Wpisanie 17 czeków na preferencje, a kolejny kod, aby dodać go do listy, wydaje mi się po prostu zbędny i niechlujny. – Jorsher

7

Niestety:

  • Wydaje się, że nie może odwoływać się pojedynczy element z tablicy w wartościach/arrays.xml z XML. Oczywiście możesz w Javie, ale nie XML. Nie ma żadnych informacji na ten temat w dokumentacji dla programistów Androida i nie mogłem znaleźć nigdzie indziej.

  • Wygląda na to, że nie można użyć tablicy jako klucza w układzie preferencji. Każdy klucz musi być pojedynczą wartością z własną nazwą klucza.

Co chcę osiągnąć: Chcę być w stanie pętli 17 preferencji, sprawdź czy element jest sprawdzany, a jeśli tak, to załadować ciąg z tablicy ciągów dla tej nazwy preferencji.

Oto kod Miałam nadzieję, że wypełnienie tego zadania:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
ArrayAdapter<String> itemsArrayList = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1); 
String[] itemNames = getResources().getStringArray(R.array.itemNames_array); 


for (int i = 0; i < 16; i++) { 
    if (prefs.getBoolean("itemKey[i]", true)) { 
     itemsArrayList.add(itemNames[i]); 
    } 
} 

Co zrobiłem:

  • ustawić jeden ciąg dla każdego z elementów i odwołuje pojedyncze sznurki . Używam pojedynczego ciągu znaków dla pól wyboru pól wyboru preferencji i tablicy dla mojej pętli.

  • Aby zapętlić preferencje, właśnie nazwałem klawisze takie jak key1, key2, key3 itd. Ponieważ odwołujesz się do klucza z ciągiem znaków, masz opcję "kompilacji" nazwy klucza w czasie wykonywania.

Oto nowy kod:

for (int i = 0; i < 16; i++) { 
     if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) { 
     itemsArrayList.add(itemNames[i]); 
    } 
} 
44

Lepszym rozwiązaniem byłoby po prostu użyć zasób powrócił tablicę jako tablicę, znaczenie:

getResources().getStringArray(R.array.your_array)[position]

Jest to podejście skrócone wyżej wymienionych podejść, ale wykonuje pracę w pożądany sposób. W przeciwnym razie Android nie zapewnia bezpośredniego indeksowania XML dla tablic opartych na języku xml.

+0

Chciałbym tylko wskazać, że to getResources() – Benjiko99

+1

@ Benjiko99 dzięki za zauważenie błędu, zmienili go odpowiednio. – Amitesh

+0

To jest najbardziej zwięzły sposób na zrobienie tego. +1! – suomi35

0

Innym sposobem na to jest zdefiniowanie tablicy zasobów w pliku strings.xml, jak poniżej.

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [ 
    <!ENTITY supportDefaultSelection "Choose your issue"> 
    <!ENTITY issueOption1 "Support"> 
    <!ENTITY issueOption2 "Feedback"> 
    <!ENTITY issueOption3 "Help"> 
    ]> 

a następnie definiując tablicę ciągów za pomocą powyższych środków

<string-array name="support_issues_array"> 
     <item>&supportDefaultSelection;</item> 
     <item>&issueOption1;</item> 
     <item>&issueOption2;</item> 
     <item>&issueOption3;</item> 
    </string-array> 

Można odnieść ten sam ciąg do innych plików XML za utrzymywanie DRY nienaruszone. Zaletą jaką widzę jest to, że przy pojedynczej zmianie wartości wpłynęłoby to na wszystkie odniesienia w kodzie.

Powiązane problemy