코드에서 문자열을 통한 리소스 찾기 및 뷰 항목 순차 검색(자식찾기)
1. 리소스 찾기
- 개발하다보면 코드에서 이름이 비슷한 여러항목의 리소스를 찾을일이 발생.
- 일일히 하나씩 이름을 기억하면서 하기엔 너무 비효율적이므로, 이름의 패턴을 활용하여 리소스를 찾아야 함.
- resources.getIdentifier 를 이용.
var subImgId : Int = resources.getIdentifier("@id/imageView" + i.toString(),"id",this.packageName)
val subImg : ImageView = findViewById(subImgId)
- imageView0,1,2 ... 이런식으로 아이디가 배정되었고, 이를 찾는다고 할 경우를 가정한다.
- 인자값 1 ("@id/imageView" + i.toString()) : 아이디의 실제값 전체 경로를 적어야 함.
- 인자값 2 ("id") : 검색할 리소스의 타입을 문자열로 적음.
- 인자값 3 : 찾을 패키지의 이름.
- id가 아닌 drawable 항목을 찾을때 예와 조합한다면,
var resID :Int = resources.getIdentifier("@drawable/dice_" + rand.toString(),"drawable", this.packageName)
subImg.setImageResource(resID)
- drawable에 dice_0, 1 ,2 ...가 있을경우를 가정.
2. 코드에서 뷰 항목 탐색
- 유니티 기준으로 보면, UI 타입으로 찾을수 있는 기본 메소드가 있다. (GetComponentInChildren<타입> )
안드로이드는 검색해봐도 그런 기본 메소드가 없는듯 하다.
findViewById 만 있고... 그래서 root 뷰를 가져온다음 getChildAt으로 탐색하여 각 요소를 일일히 확인해야 한다.
val rootItem = findViewById<ConstraintLayout>(R.id.rootItem)
val cnt = rootItem.childCount
for (i:Int in 0..cnt)
{
val viewItem = rootItem.getChildAt(i)
if(viewItem is ImageView)
{
...
}
}
- 예제는 루트 하위에 있는 모든 이미지뷰를 찾는것을 예제로 하였다.
- activity의 최상위 뷰에 아이디를 배정하여, findViewById로 찾아온다
- childCount만큼 반복하여 자식 뷰를 순차 탐색한다
- is 를 이용하여 타입을 확인한다.