2012-07-07 8 views
16

Supponiamo di aver memorizzato un array bidimensionale nella risorsa Android come mostrato di seguito. Come posso averli in una collezione java come Arraylist?Come recuperare l'array 2D dalla risorsa stringa xml per Android?

<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> 

Ad esempio, nel caso di 1 matrice bidimensionale possiamo farlo utilizzando

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

Quando il countries_array è come

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

risposta

36

può essere utilizzato solo l'elemento <string-array> di un file di risorse per matrici a dimensione singola. In altre parole, tutto tra <item> e </item> è considerato una stringa singola.

Se si desidera memorizzare i dati nel modo in cui si descrivono (in modo efficace pseudo-XML), è necessario per ottenere gli elementi come un unico String[] utilizzando getStringArray(...) e analizzare i <name> e <codes> elementi da soli.

Personalmente mi piacerebbe forse andare con un formato de-limitata, come ...

<item>Bahrain,12345</item> 

... poi basta usare split(...).

In alternativa, definire ogni <item> come JSONObject come ...

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

Buona risposta. Ma c'è una cosa importante se c'è uno spazio in json è importante per sostituire '''' con char speciale i.e. {"title": "WHITE   SHOW"} '. Altrimenti non verrà mostrato nulla. è più una caratteristica di JSON –

5

Invece di voci più valori, ho wrote about another approccio in cui è possibile memorizzare i vostri oggetti complessi come una matrice, quindi il suffisso con il nome un numero intero incrementale. Passa attraverso di loro e crea una lista di oggetti fortemente tipizzati da lì se necessario.

<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> 

Quindi è possibile creare un metodo statico per recuperarli:

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; 
     } 
    } 
} 

Può essere consumato come questo ora:

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

Il ciclo for genera un errore nella riga getString. Risorsa prevista di tipo stilizzabile. – Nilpo

+0

@Nilpo L'aggiunta di '@SuppressWarnings (" ResourceType ")' al metodo incapsulante o alla classe risolve questo problema. (Questo può accadere solo nelle versioni più recenti di Android Studio.) – Nilpo