일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- github submodule
- 쿼터뷰
- 서브모듈 pull
- submodule sourcetree
- java
- 안드로이드개발
- Android Studio
- 앱
- 유니티
- github
- 내 맘대로 정리한 안드로이드
- 타이쿤
- 안드로이드
- DataBinding
- 티스토리
- 목서버
- 카페오냥
- firebase
- 개발
- 2d게임
- 안드로이이드 submodule
- gitlab submodule
- GIT
- 게임개발
- 코틀린
- 앱개발
- Unity
- Kotlin
- 서브모듈 sourcetree
- Android
- Today
- Total
Uing? Uing!!
[안드로이드 팁] Resources.getIdentifer(): 변수값을 조합해서 리소스 아이디 받아오기 본문
리소스
안드로이드에서는 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 메소드는 정말 이렇게 유연한 타입의 리소스를 적용할 필요성이 있다고 판단되는 곳에서 사용하면 좋다.
'Android' 카테고리의 다른 글
[안드로이드 팁] WebView에서 window.close() 이벤트 받아서 창 닫기 (0) | 2020.12.17 |
---|---|
[안드로이드 팁] dp to px 변환하는 방법 (0) | 2020.12.13 |
[내맘대로 정리한 안드로이드] ANR(Application Not Responding)이란? (0) | 2020.11.28 |
[안드로이드 팁] Java로 디컴파일(Decompile)해서 코드 이해하기 (0) | 2020.11.17 |
[안드로이드 팁] Layout Inspector : 실시간 레이아웃 디버깅하기 (0) | 2020.11.15 |