Android

코드에서 문자열을 통한 리소스 찾기 및 뷰 항목 순차 검색(자식찾기)

Dean83 2022. 5. 20. 13:47

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 를 이용하여 타입을 확인한다.