R.drawable kimliklerini XML dizisinde saklama


148

R.drawable.*XML değerleri dosyası kullanarak bir dizi içinde çekilebilir kaynakların kimliğini depolamak ve ardından diziyi etkinliğimden almak istiyorum.

Bunu nasıl başaracağınıza dair bir fikriniz var mı?


1
"XML kullanarak bir dizi içinde" ile ne demek istediğini açıklayabilir misin?
Eugene S

değerler dosyası. ör. strings.xml
gammaraptor

1
Bunu neden yapmak isteyeceğini anlamıyorum. Bunu neden bu şekilde yapmak istediğiniz hakkında biraz daha bilgi verebilir misiniz?
mattr-

Gerektiğinden daha karmaşık bir şey yapmaya çalışıyor gibisin.
Octavian A. Damiean

3
Yapmaya çalıştığım şey, bir liste görünümünde görüntülenecek resimlerin kimliğini saklamak.
gammaraptor

Yanıtlar:


365

Bir kullanmak yazılan dizi içinde arrays.xmlsizin içinde dosyanın /res/valuesklasöründe o böyle görünüyor:

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

Ardından aktivitenizde onlara şu şekilde erişin:

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

6
İmgs.getResourceId (i, -1) içindeki -1'in ne anlama geldiğini açıklayabilir misiniz?
Nishad

6
Öneri: "imgs" kullanıcısından sonra şu satırı ekleyin: imgs.recycle ();
benoffi7

9
Varsayılan kimlik için -1 yerine 0 kullanmalısınız. -1 geçerli bir kaynak kimliğidir, 0 ise boş kaynaktır.
Alex

6
fantastik! yazılmış diziler tatlıdır.
asgs

2
TypedArray için öğe sayısını elde etmek için length () öğesini kullanın.
Roger Huang

31

Gelen valueklasörüne oluşturmak xmldosya adını arrays.xml bu şekilde kendisine veri eklemek

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

Ardından bu şekilde kodunuza alın

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

Daha sonra, örneğin aşağıdaki kodu kullanmak için Drawablebunlardan birini kullanmakimg TypedArrayImageView background

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

nerede indexolduğunu Drawableendeksi. defaultValuebunda öğe yoksa verdiğiniz bir değerdirindex

Hakkında daha fazla bilgi için TypedArraybu bağlantıyı ziyaret edin http://developer.android.com/reference/android/content/res/TypedArray.html


15

Bunu, çekilebilir öğeler gibi diğer kaynaklardan oluşan bir dizi oluşturmak için kullanabilirsiniz. Dizinin homojen olması gerekmediğine dikkat edin, bu nedenle bir dizi karma kaynak türü oluşturabilirsiniz, ancak dizide ne ve nerede veri türlerinin bulunduğunu bilmeniz gerekir.

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

Ve faaliyetinizdeki kaynakları bunun gibi elde edin

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

Zevk almak!!!!!


1

kotlin yolu şu olabilir:

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

Kotlin'de şunları yapabilirsiniz: -

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

Kaynaktan Görüntü dizisi alacaksınız. TypedArray

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

endekse göre kaynak kimliğini al

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

VEYA imageView kaynağını id olarak ayarlayabilirsiniz

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

ve son olarak diziyi geri dönüştür

imageArray.recycle()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.