Uing? Uing!!

[안드로이드 팁] Resources.getIdentifer(): 변수값을 조합해서 리소스 아이디 받아오기 본문

Android

[안드로이드 팁] Resources.getIdentifer(): 변수값을 조합해서 리소스 아이디 받아오기

Uing!! 2020. 12. 11. 01:24
반응형

리소스

안드로이드에서는 string, integer, dimen, color, style 등 여러가지 값들을 Resource 내의 파일에 이렇게 지정해두고,

<string name="sample_string">샘플 스트링</string>

아래처럼 가져와서 사용할 수 있다. 

val animalName = resources.getString(R.string.sample_string)

 

 

리소스의 id를 동적으로 받아와야 하는 경우

리소스 아이디가 위의 예시처럼 sample_string과 같은 깔끔한 이름이라면 문제가 없지만, 이런 상황을 가정해 보자.

 

어플리케이션에 사용되는 100 종류의 동물이 있는데, 각 동물의 명칭은 strings.xml 파일에 animal_{동물id}라는 name으로 추가되어 있다.

그렇다면 strings.xml 파일에는 값들이 이런 방식으로 지정되어 있을 것이다.

<string name="animal_cat">고양이</string>
<string name="animal_dog">강아지</string>
<string name="animal_rabbit">토끼</string>
<string name="animal_horse">말</string>

 

아마도 코드에서 가지고 있는 string 값은 'animal_cat'이나 'animal_dog'이 아닌, 'cat', 'dog'일 것이다.

단순 String 활용을 위해서라면 'animal_$name'처럼 붙여서 사용할 수  있겠지만, 리소스 id의 값으로 활용해야 한다면?

 

resources.getString()함수에는 id값에 해당하는 정수값만 들어갈 수 있기 때문에, 'animal_$name'과 같은 스트링은 사용할 수 없다.

즉, 이런 문법은 허용되지 않는다.

val type = "cat"
val resId = "animal_$type"
val animalName = resources.getString(R.string.resId) // 허용되지 않는 문법
val animalName = resources.getString(resId) // 허용되지 않는 문법

Resources.getIdentifier()

이런 상황에서는 Resources 클래스의 getIdentifier 메소드를 사용하면 id를 동적으로 받아와 활용할 수 있다.

활용 예시는 아래와 같다.

val type = "cat"
val resId = resources.getIdentifier("animal_$type","string",packageName)
val animalName = resources.getString(resId)

getIdentifier 메소드 안에는 세 개의 인자가 들어가는데, 각각 리소스의 name, 리소스의 type, 그리고 패키지명이다.

이 메소드를 활용하면 다양한 형태의 리소스들을 유연하게 불러올 수 있다.

주의할 점

getIdentifier는 필요에 따라 적절한 리소스를 불러오기 좋은 메소드이지만, 아주 단점이 없는 것은 아니다.

위의 예시와 같이 "animal_$type"의 형식으로 리소스를 사용할 경우, 이 코드를 보지 않으면 관련된 리소스들이 실제 사용되고 있다는 것을 알기 어렵다.

예를 들어 animal_cat이라는 리소스는 animal_$type에서 활용되고 있지만, animal_cat 리소스에 우클릭을 하여 find usages를 해도 사용되는 곳이 없다고 나타난다.

따라서 getIdentifier 메소드는 정말 이렇게 유연한 타입의 리소스를 적용할 필요성이 있다고 판단되는 곳에서 사용하면 좋다.

 

반응형
Comments