R.drawable IDをXML配列に格納する


146

描画可能なリソースのIDをR.drawable.*XML値ファイルを使用して配列内の形式で保存し、アクティビティで配列を取得したいと考えています。

これを達成する方法のアイデアはありますか?


1
「XMLを使用した配列内」の意味を明確にできますか?
ユージーンS

値ファイル。例:strings.xml
gammaraptor 2011

1
なぜこれをしたいのかわかりません。このようにしたい理由について、もう少し背景を教えてください。
mattr-

必要以上に複雑なことをしようとしているようです。
Octavian A. Damiean 2011

3
私がやろうとしていることは、リストビューに表示される画像のIDを保存することです。
gammaraptor 2011

回答:


362

次のように、フォルダー内のファイルで型指定された配列を使用しarrays.xmlます/res/values

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

次に、アクティビティで次のようにアクセスします。

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
どうもありがとうございました。私はコードを変更しましたが、今では機能します。どうもありがとうございました。
gammaraptor 2011

6
imgs.getResourceId(i、-1)の-1の意味を説明できますか?
Nishad 2013

6
推奨事項:ユーザー「imgs」の後に次の行を追加します:imgs.recycle();
benoffi7 2014年

9
デフォルトIDには、-1ではなく0を使用する必要があります。-1は有効なリソースID、0はnullリソースです。
Alex

6
素晴らしい!型付き配列はすばらしいです。
asgs

31

valueフォルダを作成しxml、それはファイル名をarrays.xml 、このようにそれにデータを追加

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

次に、この方法でコードに取得します

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

次にDrawable、これらのimg TypedArray例をでImageView background使用するには、次のコードを使用します

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

どこindexDrawableインデックスが。 defaultValueこれにアイテムがない場合に指定する値ですindex

詳細についてTypedArrayは、このリンクhttp://developer.android.com/reference/android/content/res/TypedArray.htmlにアクセスしてください。


15

これを使用して、ドローアブルなどの他のリソースの配列を作成できます。配列は同種である必要はないので、混合リソースタイプの配列を作成できますが、データ型が配列の何でどこにあるかを知っておく必要があります。

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

そして、このようなあなたの活動のリソースを入手してください

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

楽しい!!!!!


1

kotlinの方法はこれである可能性があります:

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では、次のように実行できます。

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

リソースから画像の配列を取得します TypedArray

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

インデックスからリソースIDを取得する

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

または、imageViewのリソースをIDに設定できます

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

そして最後にアレイをリサイクルします

imageArray.recycle()

-2

私が知る限り、配列をR.drawableに格納することはできません。

できることは、エイリアスリソースを使用して、パスを描画可能なリソースにマップする配列をconfig.xmlまたはstrings.xmlに作成することです

これが機能するかどうかを確認し、さらにサポートが必要な場合はお知らせください。


4
質問の誤解に対して反対票が投じられました-これには制限の法令はありません...
チャーリースコットスキナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.