XML 배열에 R.drawable ID 저장


146

R.drawable.*XML 값 파일을 사용하여 드로어 블 리소스의 ID를 배열 내부 형태로 저장 한 다음 내 활동에서 배열을 검색하고 싶습니다.

이것을 달성하는 방법에 대한 아이디어가 있습니까?


1
"XML을 사용하는 배열 내부"라는 말의 의미를 명확하게 설명 할 수 있습니까?
Eugene S

가치 파일. 예 : strings.xml
gammaraptor

1
왜 당신이 이것을하고 싶어하는지 이해하지 못합니다. 왜 이런 식으로하고 싶은지에 대해 좀 더 배경 지식을 제공해 주시겠습니까?
mattr-

필요한 것보다 더 복잡한 방법을 시도하는 것 같습니다.
Octavian A. Damiean

3
내가하려고하는 것은 목록보기에 표시 될 이미지의 ID를 저장하는 것입니다.
gammaraptor

답변:


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

6
imgs.getResourceId (i, -1)의 -1이 무엇을 의미하는지 설명 할 수 있습니까?
Nishad

6
권장 사항 : "imgs"사용자 뒤에 다음 행을 추가하십시오. imgs.recycle ();
benoffi7

9
기본 ID로 -1 대신 0을 사용해야합니다. -1은 유효한 리소스 ID이고 0은 null 리소스입니다.
Alex

6
환상적입니다! 타이핑 된 배열은 달콤합니다.
15:17에 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));

색인 index은 어디에 있습니까 Drawable? 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

코 틀린에서는 다음과 같이 할 수 있습니다.

 <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
의문을 오해 한 것에 대해 투표권을 잃었다 – 나는 이것에 대한 제한의 법령이 없다…
Charlie Scott-Skinner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.