[Kotlin, Android] Image View의 width, height 에 접근 할 수 없는 , 이미지 뷰의 크기가 0으로 나오는 문제 해결

[문제 발생]

 

Andoird 개발을 하다보면 View의 가로, 세로 크기를 같게 해주고 싶은 경우가 있다.

이러한 경우를 제외하고도 Image View의 width , height 값이 필요한 경우가 매우 많은데,

단순히 Image View.width로 접근 할 경우 크기가 0으로 나오게 된다.

이에 대한 해결 방법이 필요했다.

 

[해결 방안]

 

해당 문제의 이유는 View 가 그려지는 시점의 차이에 있다.

코드 상에서 Image View 의 크기에 접근하려고 할 때 해당 view가 아직 그려지지 않은 경우에는 

해당 뷰의 크기가 0으로 나오게 된다. 아직 그려지지 않은 뷰에 대한 크기를 구하려고 해서 그렇다.

따라서 View가 화면에 그려진 후에 크기를 가져오는 방식이 필요한데 이를 위해서 Observer 기능이 필요하다.

Andorid 개발 홈페이지에서는 해당 기능을 제공한다. ViewTreeObserver  |  Android Developers 

 

ViewTreeObserver  |  Android Developers

 

developer.android.com

 

<Step 1>  

 

val vto = view.viewTreeObserver

 

우선 위에서 설명한 기능을 이용하기 위해 viewTreeObserver 기능을 사용한다. (위의 링크 참조)

위에 선언한  view는 원하는 크기를 얻고자하는 뷰이며 뷰의 크기를 구하기 위해서는 

viewTreeObserver의 다양한 메소드 중에 전체 뷰가 그려진 후에 동작할 메서드가 필요했다. 

 

vto.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
    //이 함수 안에서 이제 뷰의 크기를 얻을 수있다 ///////////
        view.viewTreeObserver.removeOnGlobalLayoutListener(this)
        val w = view.measuredWidth
        view.layoutParams = FrameLayout.LayoutParams(w, w)

    }
    ///////////////////////////////

})

 

위의 코드 내부에서 뷰가 다 그려진 후의 크기를 얻을 수 있다.

내가 사용한 코드는 뷰의 높이와 너비를 같게 해주는 코드이다.

 

<Step 2>  해당 Observer 삭제

vto.removeOnGlobalLayoutListener(this)

 

원하는 결과값을 얻은 후에는 앞에 선언한 레이아웃 콜백을 제거해 주는 것이 좋다.

 

[리뷰]

 

뷰가 그려지기 전에 뷰의 크기를 가져오면 0 을 view에 넣어주는 심각한 오류가 발생한다. 

이를 방지하기 위한 좋은 해결 방법을 알게 되었다.