text ViewPager设置WRAP_CONTENT无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text ViewPager设置WRAP_CONTENT无效相关的知识,希望对你有一定的参考价值。

ViewPager设置wrap_content无效
2016年05月06日 15:09:22 EdwardHere 阅读数:2029
 版权声明:本文为博主原创文章,未经博主允许不得转载。	https://blog.csdn.net/dct8888/article/details/51331811
问题描述 
最近开发中ViewPager设置高度为wrap_content,然后在ItemView中固定高度,发现ViewPager并不能自适应调整高度,总是会占满可以用的布局,效果和match_parent一样 
问题分析 
于是看了一下ViewPager的源码,尺寸问题一般是在onMeasure时确定的,定位到ViewPager的onMeasure中查看:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // For simple implementation, our internal size is always 0.
    // We depend on the container to specify the layout size of
    // our view.  We can't really know what it is since we will be
    // adding and removing different arbitrary views and do not
    // want the layout to change as this happens.
    setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
            getDefaultSize(0, heightMeasureSpec));

    final int measuredWidth = getMeasuredWidth();
    final int maxGutterSize = measuredWidth / 10;
    mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
    ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
从注释可以看到,viewPager把自己默认的size都是0,然后优先用父布局传过来的宽高,其效果就是宽高没有指定的话就相当于match_parent,完全不考虑子view的属性,因为子view可以被动态的添加或删除,宽高可能是不确定的。 
问题总结 
从问题分析可以知道,要限制ViewPager的高度,不能靠ViewPager自身的wrap_content实现,可以写死固定高度,可以通过外部加一个布局来限制高度,当然,如果非要使用wrap_content来限制高度的话,可以重写onMeasure方法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = 0;
        //下面遍历所有child的高度
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec,
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if (h > height) //采用最大的view的高度。
                height = h;
        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
                MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }

以上是关于text ViewPager设置WRAP_CONTENT无效的主要内容,如果未能解决你的问题,请参考以下文章

使用ViewPager实现广告滑动效果

tablayout+viewpager怎么设置取消滑动

如何设置 ViewPager 大小

使用 recyclerview 和 Asynctask 设置 Viewpager

ViewPager 以编程方式设置当前页面

Android 中ViewPager练习