Armazenando IDs R.drawable na matriz XML

146

Gostaria de armazenar o ID dos recursos desenháveis ​​na forma de R.drawable.*dentro de uma matriz usando um arquivo de valores XML e, em seguida, recuperar a matriz na minha atividade.

Alguma idéia de como conseguir isso?

gammaraptor
fonte
1
Você pode esclarecer o que você quer dizer com "dentro de uma matriz usando XML"?
Eugene S
um arquivo de valores. por exemplo, strings.xml
gammaraptor
1
Não entendo por que você gostaria de fazer isso. Você poderia fornecer um pouco mais de informações sobre por que deseja fazer dessa maneira?
mattr-
Parece que você está tentando fazer algo muito mais complicado do que o necessário.
Octavian A. Damiean
3
O que estou tentando fazer é armazenar o ID das imagens que serão exibidas em uma lista.
gammaraptor

Respostas:

362

Você usa uma matriz digitada no arrays.xmlarquivo dentro da sua /res/valuespasta com a seguinte aparência:

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

Em sua atividade, acesse-os da seguinte maneira:

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
fonte
1
Muito obrigado. Eu adaptei o código, e agora ele funciona. Muito obrigado.
gammaraptor
6
Ei, você pode explicar o que significa -1 em imgs.getResourceId (i, -1)?
Nishad 26/09/13
6
Recomendação: Após o usuário "imgs", adicione a seguinte linha: imgs.recycle ();
benoffi7
9
Você deve usar 0 em vez de -1 para o ID padrão. -1 é um ID de recurso válido, enquanto 0 é o recurso nulo.
Alex
6
fantástico! matrizes digitadas são doces.
asgs 05/05
31

Na valuepasta create xmlfile name, arrays.xml adicione os dados dessa maneira

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

Em seguida, obtenha-o no seu código dessa maneira

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

Em seguida, use um Drawabledesses noimg TypedArray exemplos, por exemplo, ImageView backgrounduse o código a seguir

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

onde indexestá o Drawableíndice defaultValueé um valor que você atribui se não houver nenhum itemindex

Para obter mais informações sobre, TypedArrayvisite este link http://developer.android.com/reference/android/content/res/TypedArray.html

Ahmed Mostafa
fonte
15

Você pode usar isso para criar uma variedade de outros recursos, como drawables. Observe que não é necessário que a matriz seja homogênea, portanto, você pode criar uma matriz de tipos de recursos mistos, mas deve estar ciente de quais e onde os tipos de dados estão na matriz.

 <?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 obtenha os recursos em sua atividade como este

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

Aproveitar!!!!!

yubaraj poudel
fonte
1

Kotlin maneira poderia ser esta:

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

No Kotlin, você pode fazer o seguinte: -

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

Você obterá uma matriz de imagem do recurso como TypedArray

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

obter ID do recurso pelo índice

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

OU você pode definir o recurso do imageView como o id

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

e finalmente reciclar a matriz

imageArray.recycle()
Alok Mishra
fonte
-2

Você não pode armazenar matrizes em R..drawable até onde eu sei.

O que você pode fazer é criar uma matriz em config.xml ou strings.xml que mapeie um caminho para um recurso desenhável usando um recurso de alias .

Veja se isso funciona e entre em contato se precisar de ajuda adicional.

Codeman
fonte
4
Abaixo votou mal-entendido a pergunta - não existe estatuto de limitações sobre isso eu tenho medo ...
Charlie Scott-Skinner