158 votes

Stocker les ID de R.drawable dans un tableau XML

Je voudrais stocker l'ID des ressources dessinables sous la forme de R.drawable.* dans un tableau en utilisant un fichier de valeurs XML, et ensuite récupérer le tableau dans mon activité.

Avez-vous une idée de la manière d'y parvenir ?

1 votes

Pouvez-vous préciser ce que vous entendez par "à l'intérieur d'un tableau en utilisant XML" ?

0 votes

Un fichier de valeurs. par exemple, strings.xml

1 votes

Je ne comprends pas pourquoi vous voulez faire cela. Pourriez-vous nous en dire un peu plus sur les raisons pour lesquelles vous voulez procéder de cette façon ?

382voto

Patrick Kafka Points 4857

Vous utilisez un tableau typé sur arrays.xml dans votre fichier /res/values 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>

Ensuite, dans votre activité, accédez-y comme suit :

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

// get resource ID by index, use 0 as default to set null resource
imgs.getResourceId(i, 0)

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

// recycle the array
imgs.recycle();

1 votes

Merci beaucoup. J'ai adapté le code, et maintenant ça marche. Merci beaucoup.

6 votes

Pouvez-vous expliquer ce que signifie le -1 dans imgs.getResourceId(i,-1) ?

0 votes

DefValue - Valeur à renvoyer si l'attribut n'est pas défini ou n'est pas une ressource. Je suis presque sûr que l'imageview sera vide si elle doit utiliser la valeur par défaut -1. [developer.Android.com/reference/Android/content/res/](http://developer.android.com/reference/android/content/res/TypedArray.html#getResourceId(int) , int)

33voto

Ahmed Mostafa Points 898

Dans le value création du dossier xml le nom du 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>

Puis obtenez-le dans votre code de cette façon

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

Ensuite, pour utiliser un Drawable de ces derniers dans le img TypedArray par exemple en tant que ImageView background utiliser le code suivant

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

index est le Drawable l'index. defaultValue est une valeur que vous donnez s'il n'y a pas d'article à cet endroit. index

Pour plus d'informations sur TypedArray visitez ce lien http://developer.Android.com/reference/Android/content/res/TypedArray.html

17voto

yubaraj poudel Points 2430

Vous pouvez l'utiliser pour créer un tableau d'autres ressources, telles que des éléments graphiques. Notez que le tableau n'a pas besoin d'ê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 dans votre activité comme ceci

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

Enjoy !!!!!

5voto

Alok Mishra Points 183

En Kotlin, vous pouvez faire comme suit :-.

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

Vous obtiendrez un tableau d'images à partir de la ressource en tant que TypedArray

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

obtenir l'ID de la ressource par l'index

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

OU vous pouvez définir la ressource de imageView à l'id

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

et enfin recycler le tableau

imageArray.recycle()

2voto

Jan Rabe Points 89

La voie kotlin pourrait être celle-ci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X