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);
}