Android经验谈:当ViewPager遇见ScrollView,ViewPager已经害羞的躲了起来。

最近在做项目的时候使用了TabLayout+ViewPager 的组合来实现Tab页切换的效果。不得不说这个组合对项目开发真的是提供了太大的便利,但有时也会有一些小尴尬。

问题现象还原:我在Viewpager中放入了多个Fragment,当ScrollView的内容很多,多到一个屏幕盛不了的时候(在我的项目中是有一个富文本区域,有时文本多到一页盛不下),下拉ScrollView到最后,发现ViewPager的内容没有显示!!

调试过程

  • 当我把ViewPager的高度写成match_parent或者wrap_content时,ViewPager无法显示。当我把ViewPager写死高度时,Fragment正常显示,但是我需要的是自适应高度。
  • 我发现在相同的页面,如果富文本内容不多,Fragment正常显示
  • 我打了很多断点,发现一个问题,当初始化了Tablayout和ViewPager但是还未显示ScollView中的富文本时候,Fragment是显示了的,但是当富文本显示之后,Boom~Fragment消失了。

解决方案

自定义一个ViewPager,重写onMeasure方法。

class ScrollViewPager : ViewPager {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        var height = 0
        for (i in 0 until childCount) {
            val child = getChildAt(i)
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED))
            val h = child.measuredHeight
            if (h > height) height = h
        }

        val mHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
        super.onMeasure(widthMeasureSpec, mHeightMeasureSpec)
    }
}

在布局文件中使用:

         
   

能解决你的问题吗?

你可能感兴趣的:(Android经验谈:当ViewPager遇见ScrollView,ViewPager已经害羞的躲了起来。)