Archiviazione di ID R.drawable in array XML


146

Vorrei archiviare l'ID delle risorse estraibili sotto forma di R.drawable.*all'interno di un array utilizzando un file di valori XML, quindi recuperare l'array nella mia attività.

Qualche idea su come raggiungere questo obiettivo?


1
Puoi chiarire cosa intendi con "all'interno di un array usando XML"?
Eugene S

un file di valori. ad esempio, strings.xml
gammaraptor

1
Non capisco perché vorresti farlo. Potresti fornire qualche informazione in più sul perché vuoi farlo in questo modo?
mattr-

Sembra che tu stia cercando di fare qualcosa di molto più complicato del necessario.
Ottaviano A. Damiano il

3
Quello che sto cercando di fare è archiviare l'id per le immagini che verranno visualizzate in una visualizzazione elenco.
gammaraptor,

Risposte:


362

Si utilizza un array tipizzato nel arrays.xmlfile all'interno della /res/valuescartella che assomiglia a questo:

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

Quindi, nella tua attività, accedi ad essi in questo modo:

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

1
Grazie mille. Ho adattato il codice e ora funziona. Grazie mille.
gammaraptor,

6
Ehi, puoi spiegare cosa significa -1 in imgs.getResourceId (i, -1)?
Nishad,

6
Raccomandazione: dopo che l'utente "imgs" aggiunge la seguente riga: imgs.recycle ();
benoffi7,

9
Dovresti usare 0 invece di -1 per l'id predefinito. -1 è un ID risorsa valido, mentre 0 è la risorsa null.
Alex

6
fantastico! le matrici tipizzate sono dolci.
chiede

31

Nella valuecartella crea xmlil nome del file, arrays.xml aggiunge i dati in questo modo

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

Quindi procuralo nel tuo codice in questo modo

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

Quindi utilizzare uno Drawabledi questi come img TypedArrayad esempio come ImageView backgroundutilizzare il seguente codice

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

dov'è indexl' Drawableindice. defaultValueè un valore che dai se non ci sono articoli in questoindex

Per ulteriori informazioni su TypedArrayvisitare questo link http://developer.android.com/reference/android/content/res/TypedArray.html


15

Puoi usarlo per creare una matrice di altre risorse, come i disegni a disegno. Non è necessario che l'array sia omogeneo, quindi è possibile creare un array di tipi di risorse misti, ma è necessario conoscere quali e dove sono i tipi di dati nell'array.

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

E ottieni le risorse della tua attività in questo modo

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

Godere!!!!!


1

Kotlin Way potrebbe essere questo:

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

1

In Kotlin, puoi fare come: -

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

Otterrai una matrice di immagini dalla risorsa come TypedArray

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

ottenere l'ID risorsa dall'indice

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

O è possibile impostare la risorsa di imageView sull'id

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

e infine riciclare l'array

imageArray.recycle()

-2

Per quanto ne so, non è possibile memorizzare array in R.drawable.

Quello che puoi fare è creare un array in config.xml o strings.xml che associ un percorso a una risorsa disegnabile usando una risorsa alias .

Verifica se funziona e fammi sapere se hai bisogno di ulteriore aiuto.


4
Down ha votato per l'incomprensione della domanda - non ho uno statuto di limitazioni su questo, temo ...
Charlie Scott-Skinner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.