Almacenamiento de ID de R.drawable en matriz XML

146

Me gustaría almacenar la identificación de los recursos extraíbles en forma de R.drawable.*una matriz utilizando un archivo de valores XML y luego recuperar la matriz en mi actividad.

¿Alguna idea de cómo lograr esto?

gammaraptor
fuente
1
¿Puedes aclarar lo que quieres decir con "dentro de una matriz usando XML"?
Eugene S
Un archivo de valores. ej. strings.xml
gammaraptor
1
No entiendo por qué querrías hacer esto. ¿Podría proporcionarnos un poco más de información sobre por qué quiere hacerlo de esta manera?
mattr-
Parece que estás tratando de hacer algo mucho más complicado de lo necesario.
Octavian A. Damiean
3
Lo que intento hacer es almacenar la identificación de las imágenes que se mostrarán en una vista de lista.
gammaraptor

Respuestas:

362

Utiliza una matriz escrita en un arrays.xmlarchivo dentro de su /res/valuescarpeta que se ve así:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <integer-array name="random_imgs">
        <item>@drawable/car_01</item>
        <item>@drawable/balloon_random_02</item>
        <item>@drawable/dog_03</item>
    </integer-array>

</resources>

Luego, en su actividad, acceda a ellos de la siguiente manera:

TypedArray imgs = getResources().obtainTypedArray(R.array.random_imgs);

// get resource ID by index
imgs.getResourceId(i, -1)

// or set you ImageView's resource to the id
mImgView1.setImageResource(imgs.getResourceId(i, -1));

// recycle the array
imgs.recycle();
Patrick Kafka
fuente
1
Muchas gracias. Adapte el código, y ahora funciona. Muchas gracias.
gammaraptor
66
Oye, ¿puedes explicar qué significa -1 en imgs.getResourceId (i, -1)?
Nishad
66
Recomendación: Después de que el usuario "imgs" agregue la siguiente línea: imgs.recycle ();
benoffi7
9
Debería usar 0 en lugar de -1 para la identificación predeterminada. -1 es un ID de recurso válido, mientras que 0 es el recurso nulo.
Alex
66
¡fantástico! Las matrices escritas son dulces.
pide
31

En la valuecarpeta crear xmlnombre de archivo, arrays.xml agregue los datos de esta manera

<integer-array name="your_array_name">
    <item>@drawable/1</item>
    <item>@drawable/2</item>
    <item>@drawable/3</item>
    <item>@drawable/4</item>
</integer-array>

Luego obténgalo en su código de esta manera

private TypedArray img;
img = getResources().obtainTypedArray(R.array.your_array_name);

Luego, para usar uno Drawablede estos en, img TypedArraypor ejemplo, como un ImageView backgrounduso del siguiente código

ImageView.setBackgroundResource(img.getResourceId(index, defaultValue));

donde indexesta el Drawableindice defaultValuees un valor que da si no hay ningún elemento en esteindex

Para obtener más información acerca de TypedArrayvisitar este enlace http://developer.android.com/reference/android/content/res/TypedArray.html

Ahmed Mostafa
fuente
15

Puede usar esto para crear una variedad de otros recursos, como elementos extraíbles. Tenga en cuenta que no se requiere que la matriz sea homogénea, por lo que puede crear una matriz de tipos de recursos mixtos, pero debe saber qué y dónde están los tipos de datos en la matriz.

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

Y obtenga los recursos en su actividad como esta

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

¡¡¡¡¡Disfrutar!!!!!

Yubaraj Poudel
fuente
1

Kotlin Way podría ser esto:

fun Int.resDrawableArray(context: Context, index: Int, block: (drawableResId: Int) -> Unit) {
  val array = context.resources.obtainTypedArray(this)
  block(array.getResourceId(index, -1))
  array.recycle()
}

R.array.random_imgs.resDrawableArray(context, 0) {
  mImgView1.setImageResource(it)
}
Jan Rabe
fuente
1

En Kotlin, puedes hacer lo siguiente:

 <integer-array name="drawer_icons">
    <item>@drawable/drawer_home</item>
</integer-array>

Obtendrá una matriz de imagen del recurso como TypedArray

 val imageArray = resources.obtainTypedArray(R.array.drawer_icons)

obtener ID de recurso por el índice

imageArray.getResourceId(imageArray.getIndex(0),-1)

O puede configurar el recurso de imageView para la identificación

imageView.setImageResource(imageArray.getResourceId(imageArray.getIndex(0),-1))

y en último reciclar la matriz

imageArray.recycle()
Alok Mishra
fuente
-2

No puedes almacenar matrices en R.drawable hasta donde yo sé.

Lo que puede hacer es crear una matriz en config.xml o strings.xml que asigne una ruta a un recurso dibujable utilizando un recurso de alias .

Vea si esto funciona y avíseme si necesita ayuda adicional.

Codeman
fuente
44
Down votó por entender mal la pregunta - no hay un estatuto de limitaciones sobre esto, me temo ...
Charlie Scott-Skinner