2012-07-07 11 views
16

Załóżmy, że zapisałem dwuwymiarową tablicę w zasobach Androida, jak pokazano poniżej. Jak mogę uzyskać je w kolekcji java, takiej jak Arraylist?Jak odzyskać tablicę 2D z zasobów ciągów xml dla Androida?

<resources> 
<string-array name="countries_array"> 
<item> 
    <name>Bahrain</name> 
    <code>12345</code> 
</item> 
<item> 
    <name>Bangladesh</name> 
    <code>54545</code> 
    </item> 
<item> 
    <name>India</name> 
    <code>54455</code> 
</item> 

</string-array> 
</resources> 

Na przykład w przypadku 1 wymiarowej tablicy możemy zrobić to za pomocą

getResources().getStringArray(R.array.countries_array); 

Gdy countries_array jest jak

<resources> 
<string-array name="countries_array"> 
    <item>Bahrain</item> 
    <item>Bangladesh</item> 
    <item>India</item> 
</string-array> 
</resources> 

Odpowiedz

36

<string-array> elementem pliku zasobów można korzystać tylko dla macierzy jednowymiarowych. Innymi słowy, wszystko pomiędzy <item> i </item> jest uważane za pojedynczy ciąg.

Jeśli chcesz przechowywać dane w sposób opisać (w praktyce pseudo-XML), musisz dostać rzeczy jako pojedynczy String[] użyciu getStringArray(...) i analizowania danych <name> i <codes> elementy samodzielnie.

Osobiście bym ewentualnie iść z formacie de ograniczone, takich jak ...

<item>Bahrain,12345</item> 

... wtedy po prostu użyć split(...).

Alternatywnie zdefiniować każdy <item> postaci JSONObject takich jak ...

<item>{"name":"Bahrain","code":"12345"}</item> 
+0

dobra odpowiedź. Ale jest jedna ważna rzecz, jeśli jest miejsce w jsonie ważne, aby zastąpić '' 'specjalnym znakiem, tj. '{" Title ":" WHITE   SHOW "}'. W przeciwnym razie nic nie zostanie pokazane. jego bardziej cechą JSON –

5

Zamiast wielu wpisów o wartościach, ja wrote about another podejście, w którym można przechowywać obiektów złożonych w postaci tablicy, następnie sufiks nazwy z przyrostowa liczba całkowita. Przeprowadź przez nie pętle i stwórz listę silnie wypisanych obiektów stamtąd, jeśli zajdzie taka potrzeba.

<resources> 
    <array name="categories_0"> 
     <item>1</item> 
     <item>Food</item> 
    </array> 
    <array name="categories_1"> 
     <item>2</item> 
     <item>Health</item> 
    </array> 
    <array name="categories_2"> 
     <item>3</item> 
     <item>Garden</item> 
    </array> 
<resources> 

Następnie można utworzyć metody statyczne, aby je odzyskać:

public class ResourceHelper { 

    public static List<TypedArray> getMultiTypedArray(Context context, String key) { 
     List<TypedArray> array = new ArrayList<>(); 

     try { 
      Class<R.array> res = R.array.class; 
      Field field; 
      int counter = 0; 

      do { 
       field = res.getField(key + "_" + counter); 
       array.add(context.getResources().obtainTypedArray(field.getInt(null))); 
       counter++; 
      } while (field != null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      return array; 
     } 
    } 
} 

To mogą być spożywane jak to teraz:

for (TypedArray item : ResourceHelper.getMultiTypedArray(this, "categories")) { 
    Category category = new Category(); 
    category.ID = item.getInt(0, 0); 
    category.title = item.getString(1); 
    mCategories.add(category); 
} 
+0

Pętla for zgłasza błąd w linii getString. Oczekiwany typ zasobu stylu. – Nilpo

+0

@Nilpo Dodanie '@SuppressWarnings (" ResourceType ")' do metody lub klasy enkapsulacji rozwiązuje to. (Może się to zdarzyć tylko w nowszych wersjach Androida Studio.) – Nilpo

Powiązane problemy