Speichern von R.drawable-IDs im XML-Array

146

Ich möchte die ID der zeichnbaren Ressourcen in Form R.drawable.*eines Arrays mithilfe einer XML- Wertedatei speichern und dann das Array in meiner Aktivität abrufen.

Irgendwelche Ideen, wie dies erreicht werden kann?

Gammaraptor
quelle
1
Können Sie klarstellen, was Sie unter "innerhalb eines Arrays mit XML" verstehen?
Eugene S
eine Wertedatei. zB
strings.xml
1
Ich verstehe nicht, warum Sie das tun möchten. Könnten Sie etwas mehr Hintergrundinformationen darüber geben, warum Sie dies auf diese Weise tun möchten?
Mattr-
Klingt so, als würden Sie versuchen, etwas viel komplizierteres als nötig zu tun.
Octavian A. Damiean
3
Ich versuche, die ID für Bilder zu speichern, die in einer Listenansicht angezeigt werden.
Gammaraptor

Antworten:

362

Sie verwenden ein typisiertes Array in einer arrays.xmlDatei in Ihrem /res/valuesOrdner, das folgendermaßen aussieht:

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

Greifen Sie dann in Ihrer Aktivität wie folgt darauf zu:

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
quelle
1
Vielen Dank. Ich habe den Code angepasst und jetzt funktioniert es. Vielen Dank.
Gammaraptor
6
Hey, kannst du erklären, wofür -1 in imgs.getResourceId (i, -1) steht?
Nishad
6
Empfehlung: Fügen Sie nach dem Benutzer "imgs" die folgende Zeile hinzu: imgs.recycle ();
Benoffi7
9
Sie sollten 0 anstelle von -1 für die Standard-ID verwenden. -1 ist eine gültige Ressourcen-ID, während 0 die Null-Ressource ist.
Alex
6
Fantastisch! typisierte Arrays sind süß.
Asgs
31

Im valueOrdner create xmlfile name arrays.xml werden die Daten auf diese Weise hinzugefügt

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

Dann erhalten Sie es auf diese Weise zu Ihrem Code

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

Um dann eine Drawabledavon im img TypedArrayBeispiel zu ImageView backgroundverwenden, verwenden Sie den folgenden Code

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

Wo indexist der DrawableIndex? defaultValueist ein Wert, den Sie angeben, wenn es keinen Artikel gibtindex

Weitere Informationen finden TypedArraySie unter folgendem Link: http://developer.android.com/reference/android/content/res/TypedArray.html

Ahmed Mostafa
quelle
15

Sie können dies verwenden, um ein Array anderer Ressourcen zu erstellen, z. B. Drawables. Beachten Sie, dass das Array nicht homogen sein muss, damit Sie ein Array mit gemischten Ressourcentypen erstellen können. Sie müssen jedoch wissen, welche und wo sich die Datentypen im Array befinden.

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

Und erhalten Sie die Ressourcen in Ihrer Aktivität wie folgt

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

Genießen!!!!!

Yubaraj Poudel
quelle
1

Kotlin Weg könnte sein:

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
quelle
1

In Kotlin können Sie Folgendes tun:

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

Sie erhalten ein Array von Bildern aus der Ressource als TypedArray

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

Ressourcen-ID anhand des Index abrufen

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

ODER Sie können die Ressource von imageView auf die ID setzen

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

und zuletzt das Array recyceln

imageArray.recycle()
Alok Mishra
quelle
-2

Soweit ich weiß, können Sie keine Arrays in R.drawable speichern.

Sie können ein Array in config.xml oder strings.xml erstellen, das mithilfe einer Alias-Ressource einen Pfad zu einer zeichnbaren Ressource zuordnet .

Überprüfen Sie, ob dies funktioniert, und lassen Sie mich wissen, wenn Sie zusätzliche Hilfe benötigen.

Codeman
quelle
4
Down stimmte für das Missverständnis der Frage - es gibt keine Verjährungsfrist, fürchte ich ...
Charlie Scott-Skinner