비슷한 속성을 가지면서 이미지 내의 일부만 변하는 이미지들의 이름은 대부분 [이미지이름]_[이미지번호].[확장자] 형식으로 구성됩니다. 이러한 이미지를 프로젝트 폴더의 리소스 폴더에 넣게 되면 자동으로 R.drawable 클래스에 [이미지이름]_[이미지번호] 라는 이름으로 필드가 생성되고, 각 리소스에 접근할 수 있는 주소가 할당됩니다. 다음은 R.drawable 클래스 내에 선언된 필드의 예를 보여줍니다.
public static final class drawable {
public static final int ic_launcher=0x7f020000;
public static final int img_0=0x7f020001;
public static final int img_1=0x7f020002;
public static final int img_2=0x7f020003;
public static final int img_3=0x7f020004;
public static final int img_4=0x7f020005;
public static final int img_5=0x7f020006;
}
애플리케이션 내에서 이미지 리소스에 접근하려면 R.drawable.[리소스명] 으로 접근하는데, 위의 예시와 같이 이미지 시퀀스가 리소스에 있을 경우 각 이미지에 접근하기 위해 R.drawable.img_0, R.drawable.img_1 ... 등 각 리소스의 이름으로 접근해야 하므로 이미지 번호가 있음에도 불구하고 전체 이미지 이름으로 접근해야 하므로 매우 불편합니다.
이미지가 10개 이내라면 일일이 리소스 이름을 적어도 별 문제가 없겠지만, 이 이상으로 늘어나게 되면 각 리소스를 다루기가 매우 어려워집니다. 리소스가 100개라면 100개의 이름을 하나하나 입력해야 하니, 보통 짜증나는 일이 아니죠.. -_-;;
이러한 불편함을 해결하기 위해, Reflection을 사용하여 R.drawable 클래스 내의 필드 값을 불러오는 방식으로 [이미지이름]+[시퀀스번호] 형태로 구성된 리소스에 접근하는 방법을 알아보겠습니다.
[애플리케이션 정보]
액티비티
Main (Main.java)
레이아웃
main.xml (Main)
예제 프로젝트:
MultipleImageHandling.zip
예제 애플리케이션의 레이아웃은 다음과 같습니다. 이미지 번호를 선택할 수 있는 SeekBar, 현재 시퀀스 번호를 보여주는 TextView, 선택된 이미지를 보여주는 ImageView로 구성되어 있습니다.
저도 비슷한 방식으로 써본적이 있지만 코드가 조금 틀려 소개해 봅니다.
asset에 json을 넣고 읽는 방식인데요. JSON을 만들어 넣을때 resource ID(int)를 얻을순 없잖아요. 그래서 찾아보니
Resources.getIdentifier 가 있더군요
http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String, java.lang.String, java.lang.String)
int resId = res.getIdentifier("resfilename", "drawable", "com.com.com");
이렇게 해서 리소스 아이디를 얻은후 JSON에 다시 덮어 씌워서 JSON구조를 직접 사용했습니다. 최초 Init 과정이 필요하지만 편하고 좋아요 :D