2010-12-01 17 views
40

Estoy tratando de implementar una estructura de datos de recursos que incluye una matriz de matrices, específicamente cadenas. El problema que encuentro es cómo obtener los objetos de la matriz secundaria y sus valores específicos. Esto es lo que se ve mi archivo de recursos como ....Android Resource - Array of Arrays

<resources> 
    <array name="array0"> 
    <item> 
     <string-array name="array01"> 
     <item name="id">1</item> 
     <item name="title">item one</item> 
     </string-array> 
    </item> 
    <item> 
     <string-array name="array02"> 
     <item name="id">2</item> 
     <item name="title">item two</item> 
     </string-array> 
    </item> 
    <item> 
     <string-array name="array03"> 
     <item name="id">3</item> 
     <item name="title">item three</item> 
     </string-array> 
    </item> 
    </array> 
</resources> 

Entonces, en mi código Java que recuperar la matriz y tratar de acceder a los elementos sub así ...

TypedArray typedArray = getResources().obtainTypedArray(R.array.array0); 

TypedValue typedValue = null; 

typedArray.getValue(0, typedValue); 

En este señale que el objeto TypedArray debe representar el conjunto de cadenas "array01"; sin embargo, no veo cómo recuperar los elementos de cadena "id" y "title". Cualquier ayuda sería apreciada, gracias de antemano.

+0

Como señaló Andi Krusch, no se deje atrapar por los atributos de "nombre" que utilicé en el XML. Están allí para hacer que mi pregunta sea más fácil de entender. (Pensé) :-) – JediPotPie

+0

wow! Pensé que esto sería fácil para alguien. Entonces, ¿la comunidad está diciendo que no se puede hacer? – JediPotPie

Respuesta

111

Puede hacer casi lo que quiera. Debe declarar cada matriz por separado y luego una matriz de referencias. Algo como esto:

<string-array name="array01"> 
    <item name="id">1</item> 
    <item name="title">item one</item> 
</string-array> 
<!-- etc. --> 
<array name="array0"> 
    <item>@array/array01</item> 
    <!-- etc. --> 
</array> 

Luego, en el código de haces algo como esto:

Resources res = getResources(); 
TypedArray ta = res.obtainTypedArray(R.array.array0); 
int n = ta.length(); 
String[][] array = new String[n][]; 
for (int i = 0; i < n; ++i) { 
    int id = ta.getResourceId(i, 0); 
    if (id > 0) { 
     array[i] = res.getStringArray(id); 
    } else { 
     // something wrong with the XML 
    } 
} 
ta.recycle(); // Important! 
+0

punta increíble !!!! –

+0

no puedo obtener el elemento de la matriz. ¿Puedes dar alguna solución? Por favor, – user

+0

@Trupti - ¿Por qué no? Si esta respuesta no funciona para usted, publique una pregunta que muestre lo que está intentando y describa lo que está sucediendo. –

-3

Una matriz no es un par nombre/valor. Solo puedes acceder a los elementos por número. La sintaxis en el xml es incorrecta. Debería ser de esa manera:

<string-array name="string_array_name"> 
    <item>text_string1</item> 
    <item>text_string2</item> 
</string-array> 
+0

Estrictamente hablando, la sintaxis del XML no es incorrecta. Puse esos nombres para que sea más legible para mi pregunta. Usted malinterpretó mi pregunta. La pregunta es, ¿cómo puedo acceder a los elementos de la matriz secundaria desde el objeto typedArray? – JediPotPie

0

de acuerdo a la respuesta @Ted Hopp, forma más elegante:

<integer-array name="id_array"> 
    <item>1</item> 
    <item>2</item> 
    <item>3</item> 
</integer-array> 
<string-array name="name_array"> 
    <item>name 1</item> 
    <item>name 2</item> 
    <item>name 3</item> 
</string-array> 
<array name="array0"> 
    <item>@array/id_array</item> 
    <item>@array/name_array</item> 
</array> 

crea matrices sub seguro el recuento de filas es idéntico.
¡disfruta escribiendo código para acceder a las celdas de la matriz!
android es aún un niño mientras se mantiene la fea etiqueta de "elemento" de TypedArray "array0".
en mi opinión, el más flexible debería ser:

<array name="array0"> 
    <integer-array name="id_array"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </integer-array> 
    <string-array name="name_array"> 
     <item>name 1</item> 
     <item>name 2</item> 
     <item>name 3</item> 
    </string-array> 
</array> 

pero no hacerlo porque eso no es así :) androide

+1

No hay ningún requisito para que los recuentos de fila de sub-matriz sean idénticos. Android (y Java en general) es compatible con [arreglos irregulares (akk)] (https://en.wikipedia.org/wiki/Jagged_array) sin problemas. Simplemente debe prestar la debida atención a los índices de bucle al iterar a través de tales matrices. –

0

https://developer.android.com/guide/topics/resources/more-resources.html#Color

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <array name="icons"> 
     <item>@drawable/home</item> 
     <item>@drawable/settings</item> 
     <item>@drawable/logout</item> 
    </array> 
    <array name="colors"> 
     <item>#FFFF0000</item> 
     <item>#FF00FF00</item> 
     <item>#FF0000FF</item> 
    </array> 
</resources> 

Este código de aplicación recupera cada matriz y luego obtiene la primera entrada en cada matriz:

Resources res = getResources(); 
TypedArray icons = res.obtainTypedArray(R.array.icons); 
Drawable drawable = icons.getDrawable(0); 
TypedArray colors = res.obtainTypedArray(R.array.colors); 
int color = colors.getColor(0,0);