코딩하는 일용직 노동자

ViewPager 의 높이를 wrap_content로 표시하는 방법 본문

안드로이드

ViewPager 의 높이를 wrap_content로 표시하는 방법

bacass 2020. 5. 13. 16:04

공지사항을 표시할 팝업을 만들려고 합니다.
Dialog 안에는 뷰페이저가 있고 아이템으로는 ImageView 하나만 있는 Fragment 를 갖고 있습니다.
ImageView의 height를 wrap_content로 설정하고 adjustBoundView = true로 설정했습니다.
하지만 뷰페이저의 height를 wrap_content로 설정을 해도 실제 구동시 match_parent로 표시되는 문제가 있습니다.

빨간색 부분이 원래는 보이지 않아야 한다


이를 해결하려면 ViewPager를 상속받은 CustomViewPager를 만들어서 onMeasure를 오버라이딩 해줘야 합니다.

/**
 * 설명 : 일반적인 ViewPager 는 height 값이 화면 전체를 갖는다.
 *        wrap_content 만큼만 갖게 하기 위해 onMeasure 를 오버라이드 해줘야한다.
 *
 *
 * LeeWW..2020.05.12.
 */
class MeasuredViewPager : ViewPager {
    constructor(context: Context?) : super(context!!) {}
    constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {}

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        var heightMeasureSpec = heightMeasureSpec
        val mode = MeasureSpec.getMode(heightMeasureSpec)
        if (mode == MeasureSpec.UNSPECIFIED || mode == MeasureSpec.AT_MOST) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
            var height = 0
            for (i in 0 until childCount) {
                val child: View = getChildAt(i)
                child.measure(
                    widthMeasureSpec,
                    MeasureSpec.makeMeasureSpec(
                        0,
                        MeasureSpec.UNSPECIFIED
                    )
                )
                val h: Int = child.getMeasuredHeight()
                if (h > height) height = h
            }
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
                height,
                MeasureSpec.EXACTLY
            )
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }
}

 

정상적으로 wrap_content 로 표시된다