2012-07-07 6 views
16

Supongamos que he almacenado una matriz bidimensional en recursos de Android como se muestra a continuación. ¿Cómo puedo obtenerlos en una colección java como Arraylist?Cómo recuperar una matriz 2D de un recurso de cadena xml para 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> 

Por ejemplo en el caso de 1 matriz bidimensional que podemos hacerlo usando

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

Cuando el countries_array es como

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

Respuesta

36

El elemento <string-array> de un archivo de recursos sólo se puede utilizar para matrices de una sola dimensión. En otras palabras, todo entre <item> y </item> se considera una sola cadena.

Si desea almacenar los datos en la forma en que describes (efectivamente pseudo-XML), que necesita para obtener los elementos como un único String[] usando getStringArray(...) y analizar los elementos <name> y <codes> mismo.

Personalmente me gustaría ir posiblemente con un formato de-limitado como ...

<item>Bahrain,12345</item> 

... a continuación, sólo tiene que utilizar split(...).

alternativa, definir cada <item> como JSONObject como ...

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

Buena respuesta. Pero hay una cosa importante si hay un espacio en json es importante reemplazar '''' con un carácter especial, es decir, '{" title ":" WHITE   SHOW "}'. De lo contrario, no se mostrará nada. es más una característica de JSON –

5

En lugar de entradas de varios valores, que wrote about another enfoque en el que se puede almacenar sus objetos complejos como una matriz, entonces sufijo con el nombre un entero incremental. Haz un bucle a través de ellos y crea una lista de objetos fuertemente tipados desde allí si es necesario.

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

continuación, puede crear un método estático para recuperarlos:

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

Se puede consumir como esta ahora:

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

El bucle for arroja un error en la línea getString. Recurso esperado de tipo styleable. – Nilpo

+0

@Nilpo Agregar '@SuppressWarnings (" ResourceType ")' al método encapsulante o clase resuelve esto. (Esto solo puede ocurrir en las versiones más nuevas de Android Studio). – Nilpo

Cuestiones relacionadas