有时候会遇到这种需求,ViewPager里面几个Fragment,而ViewPager的外面是一个ScrollView,要求可以横滑和竖滑。
由于ScrollView的原因,ViewPager必须设置成warp_content,众所周知,这样是不行的,网上大部分的方法是,复写onMeasure方法,重新测量子view的高度,然后让ViewPager的高度等于子view里面高度最大的那一个。
类似这种代码
//viewPager的高度
var height = 0
//遍历子view得到每个子view的高度
子view集合.forEach{
if(childHeight > height) {
height = childHeight
}
}
这样的话,会有一个问题,因为每个Fragment里面的View高度不一样,滑动ViewPager会看到长度不足的Fragment页面底部会有难看的大片空白。
本文直接提供一种解决方式,相关知识在后续文章。
复写ViewPager,提供一个函数,传递viewPager的currentItem参数
public void requestLayoutByPosition(int position) {
this.current = position;
requestLayout();
}
然后在onMeasure中获得对应位置的子view高度,并用这个高度设置ViewPager的高度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
if (getChildCount() > 0) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);