안드로이드 세계

[Android] ScrollView의 Child View Height 문제 본문

안드로이드(Android)/코틀린(Kotlin)

[Android] ScrollView의 Child View Height 문제

리안94 2021. 5. 1. 12:55

ScrollView를 이용하거나, NestedScrollView를 이용할 때 자식 뷰그룹으로 ConstraintLayout을 지정할 때가 있다.

 

ConstraintLayout의 자식 뷰의 높이를 0dp로 준후에 layout_constraintHeight_percent를 이용해서 크기를 지정할때에는 자식 뷰그룹인 ConstraintLayout의 높이는 0dp이기 때문에 뷰가 그려지지 않는다.

 

검색을 하게되면 ScrollView 또는 NestedScrollView에 android:fillViewport="true"로 설정 하라는 글들이 많다.

 

실제로 사용해보면 ScrollView 또는 NestedScrollView의 크기만큼 먼저 그려주기때문에 자식 뷰들은 그려진다.

 

하지만 percent를 이용해서 크기를 지정한 경우에는 사용할 수가없다. 

 

잘 되는 것처럼 xml의 Design탭에서는 나오지만 스크롤 가능할만큼 높이를 주었음에도 불구하고 스크롤은 되지않는다.

 

해결방법은 더있을지는 모르지만 다음과 같은 방법으로 해결을 하였다.

 

실제 디바이스의 크기를 구한후, 뷰들의 높이를 일정크기만큼 지정해주었다.

 

코드는 다음과 같다.

 

fun Context.getDeviceHeight(): Int { // 디바이스의 높이를 구한다.

    val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    return if (Build.VERSION.SDK_INT >= 30) {
        windowManager.currentWindowMetrics.bounds.height()
    } else {
        val display = windowManager.defaultDisplay
        val size = Point()
        display.getSize(size)
        size.y
    }
}

 

fun resizeViewHeight(deviceHeight: Int, view: View, height: Float) { // 뷰의 크기를 조절한다.
    val layoutParams = view.layoutParams
    layoutParams.height = (deviceHeight * height).toInt()
    view.layoutParams = layoutParams
}

 

사용은 이렇게 한다.

//Fragment
private fun resizingViewHeight() {
    val deviceHeight = requireContext().getDeviceHeight()
    resizeViewHeight(deviceHeight, view, 0.05f)
}

//Activity
private fun resizingViewHeight() {
    val deviceHeight = getDeviceHeight()
    resizeViewHeight(deviceHeight, view, 0.05f)
}

 

잘못된 내용이나 더 조언해줄방법이있다면 댓글로알려주세요~!

Comments