nueijeel
[Android] getIdentifier 메서드를 통해 리소스의 이름으로 ID 얻기 본문
RecyclerView를 응용하는 예제를 풀다가 geIdentifier 메서드를 알게 됐다.
이전까지는 리소스 폴더를 통해 직접적으로 해당 리소스를 지정하여 리소스에 접근했었는데, 이번 예제에서는 다른 방식으로 접근을 해야했다.
예제에서 해결해야할 문제는 drawable 폴더에 국기 이미지가 imgflag1~imgflag8 의 이름으로 들어가있고, spinner 뷰에 국가 목록이 있는데, 이 spinner 뷰에서 선택된 국가에 해당하는 국기 이미지를 imageView에 띄우는 것이다.
spinner 뷰에는 한국말 텍스트가 담긴 배열이 목록으로 들어가있다.
spinner 뷰에서 선택된 값을 불러올 때는 selectedItemPosition 메서드를 이용했다.
selectedItemPosition은 AdapterView에서 현재 선택된 아이템의 위치를 가져오는 속성으로 위치 값은 0부터 시작하고, 선택된 아이템이 없을 경우 -1을 반환한다.
나는 이 값으로 해당 국기 리소스파일 명을 만들고 형변환을 통해 이미지 뷰에 리소스 지정을 하려고 했다.
리소스명은 int 값이라 문자열로 되어 있어도 형변환이 되지 않을까 생각했다.
val imgResource = "R.id.imgflag" + (country + 1)
holder.imageViewFlag.setImageResource(imgResource as Int)
holder.imageViewFlag.setImageResource(imgResource.toInt)
두 방법 모두 원하는 결과를 얻을 수 없었다.
그래서 imgResource 문자열을 문자열 자체가 아니라 id로 만들어서 함수 인자로 전달해야 될 것 같았는데 방법을 몰랐다.
chatGPT를 사용해 문제점을 찾으니 다음과 같은 답변을 해줬다.
이미 imgResource는 ID의 문자버전이 아닌 그냥 문자열이기 때문에 Int형으로 형변환을 해줘도 오류가 발생한다.
이 방법이 아니라 올바르게 리소스 식별자를 얻으려면 getIdentifier() 메서드를 사용하면 된다.
resources.getIdentifier 는 리소스의 이름과 타입을 사용하여 해당 리소스의 식별자를 가져오는 메서드이다.
public int getIdentifier (String name, String defType, String defPackage)
- name : 가져오려는 리소스의 이름
- defType : 리소스의 타입. drawable, string, layout 등 식별자를 얻으려는 리소스의 타입을 지정하면 된다.
- defPackage : 리소스가 속한 패키지 이름. 여기서 작성한 packageName은 앱의 패키지 이름이다.
메서드는 위 매개변수들을 가지고 다음과 같은 동작을 수행한다.
1. defType 매개변수에 전달된 리소스 타입을 기준으로 리소스를 찾습니다. (리소스 타입을 지정하지 않으면 모든 리소스 타입에서 찾습니다.)
2. name 매개변수에 전달된 이름과 일치하는 리소스를 찾습니다.
3. defPackage 매개변수에 전달된 패키지 이름을 사용하여 해당 패키지의 리소스를 찾습니다.
4. 찾은 리소스의 식별자(ID)를 반환합니다.
위와 같이 resources.getIdentifier 메서드는 리소스 이름을 동적으로 조합하여 사용해야 할 때 유용하다.
'Android > 공부' 카테고리의 다른 글
[Android] 직렬화 Serializable과 Parcelable (2) | 2024.12.27 |
---|---|
[Android] Data Store로 데이터 저장하기 (0) | 2023.12.02 |
[Android] Object Animator를 활용한 간단한 애니메이션 구현하기 (1) | 2023.11.26 |
[Android] 카카오 로그인 구현하기 (+ api key 숨기는 방법) (0) | 2023.11.15 |
[Android] LayoutInflater에 대해 (0) | 2023.07.06 |