Stockage des ID dessinables dans un tableau XML

146

Je souhaite stocker l'ID des ressources dessinables sous la forme de R.drawable.* un tableau à l'aide d'un fichier de valeurs XML, puis récupérer le tableau dans mon activité.

Des idées pour y parvenir?

gammaraptor
la source
1
Pouvez-vous clarifier ce que vous entendez par «dans un tableau utilisant XML»?
Eugene S
un fichier de valeurs. par exemple, strings.xml
gammaraptor
1
Je ne comprends pas pourquoi vous voudriez faire ça. Pourriez-vous nous expliquer un peu plus pourquoi vous voulez procéder de cette façon?
mattr-
On dirait que vous essayez de faire quelque chose de bien plus compliqué que nécessaire.
Octavian A. Damiean
3
Ce que j'essaie de faire, c'est de stocker l'identifiant des images qui seront affichées dans une liste.
gammaraptor

Réponses:

362

Vous utilisez un tableau tapé dans le arrays.xmlfichier de votre /res/valuesdossier qui ressemble à ceci:

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

Puis dans votre activité, accédez-y comme ceci:

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
la source
1
Merci beaucoup. J'ai adapté le code, et maintenant ça marche. Merci beaucoup.
gammaraptor
6
Hé, pouvez-vous expliquer ce que signifie -1 dans imgs.getResourceId (i, -1)?
Nishad le
6
Recommandation: après l'utilisateur "imgs", ajoutez la ligne suivante: imgs.recycle ();
benoffi7
9
Vous devriez utiliser 0 au lieu de -1 pour l'ID par défaut. -1 est un identifiant de ressource valide, tandis que 0 est la ressource nulle.
Alex
6
fantastique! les tableaux typés sont doux.
asgs
31

Dans le valuedossier, créez xmlun nom de fichier, arrays.xml ajoutez-y les données de cette manière

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

Ensuite, obtenez-le dans votre code de cette façon

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

Ensuite, pour utiliser l'un Drawablede ces éléments dans le, img TypedArraypar exemple, ImageView backgroundutilisez le code suivant

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

indexest l' Drawableindex. defaultValueest une valeur que vous donnez s'il n'y a pas d'article à ceciindex

Pour plus d'informations sur, TypedArrayvisitez ce lien http://developer.android.com/reference/android/content/res/TypedArray.html

Ahmed Mostafa
la source
15

Vous pouvez l'utiliser pour créer un tableau d'autres ressources, telles que des tableaux. Notez que le tableau ne doit pas nécessairement être homogène, vous pouvez donc créer un tableau de types de ressources mixtes, mais vous devez être conscient de la nature et de l'emplacement des types de données dans le tableau.

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

Et obtenez les ressources de votre activité comme ça

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

Prendre plaisir!!!!!

yubaraj poudel
la source
1

La façon kotlin pourrait être la suivante:

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
la source
1

Dans Kotlin, vous pouvez faire comme: -

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

Vous obtiendrez un tableau d'images de la ressource comme TypedArray

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

obtenir l'ID de ressource par l'index

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

OU vous pouvez définir la ressource d'imageView sur l'ID

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

et en dernier recycler le tableau

imageArray.recycle()
Alok Mishra
la source
-2

Vous ne pouvez pas stocker de tableaux dans R.drawable pour autant que je sache.

Ce que vous pouvez faire est de créer un tableau dans config.xml ou strings.xml qui mappe un chemin vers une ressource dessinable à l'aide d'une ressource d'alias .

Voyez si cela fonctionne et faites-le moi savoir si vous avez besoin d'aide supplémentaire.

Codeman
la source
4
Down a voté pour mal comprendre la question - il n'y a pas de délai de prescription à ce sujet, j'ai peur ...
Charlie Scott-Skinner