ViewPager设置wrap_content无效

来源:互联网 发布:末日战歌全套源码 编辑:程序博客网 时间:2024/06/04 23:22

问题描述
最近开发中ViewPager设置高度为wrap_content,然后在ItemView中固定高度,发现ViewPager并不能自适应调整高度,总是会占满可以用的布局,效果和match_parent一样
问题分析
于是看了一下ViewPager的源码,尺寸问题一般是在onMeasure时确定的,定位到ViewPager的onMeasure中查看:

@Overrideprotected 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);    ...}

从注释可以看到,viewPager把自己默认的size都是0,然后优先用父布局传过来的宽高,其效果就是宽高没有指定的话就相当于match_parent,完全不考虑子view的属性,因为子view可以被动态的添加或删除,宽高可能是不确定的。
问题总结
从问题分析可以知道,要限制ViewPager的高度,不能靠ViewPager自身的wrap_content实现,可以写死固定高度,可以通过外部加一个布局来限制高度,当然,如果非要使用wrap_content来限制高度的话,可以重写onMeasure方法:

@Overrideprotected 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); }
0 0
原创粉丝点击