一.背景:
第一次写博客还是技术性博客,为了回答优快云上一位网友的问题,决定写一篇博客既帮助别人又帮助自己,经常看鸿洋大神,郭大神的博客,两位大神真是业界良心,不仅仅技术厉害,博客也写的让人一目了然,自身觉得自己内心知道的知识讲给别人或者是像这样写博客给别人看,让别人也了解,是一件很厉害的事。所以第一次写这种技术性博客,不知道看到的人是否能看懂得到一些启发,如果有什么不足的地方希望大家多多指正。
二.概述:
好了,开始转入正题,关于ViewPager大家应该都很熟悉,大多数APP中必然会用到的控件(说的有点绝对,但看过的APP貌似都离不开它)。常见的两种ViewPager,一种是viewpager+imageview(滚动的banner),一种则是viewpager+fragment。无论哪种,这里讲到的自适应都可以实现。
三.实现效果:
哎,没有时间弄一幅动图,那我就口述一下吧,很多Android开发者会遇到的问题,例如,你的整个布局在一个线性布局(Linearlayout)中,简单的(vertical)竖行排列,你的viewpager上面有一些其他布局,viewpager在最下面,所以很可能嵌套在scrollview中,为了解决viewpager和scorllview的冲突,你很可能去百度viewpager的高度自适应,结果如图:
/**
* 自动适应高度的ViewPager
* @author
*
*/
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
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)
height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
这是最常见的一种处理办法,选择你fragment中高度最大的那个作为你整个viewpager的高度。解决了冲突问题,但你会遇到这样一个棘手的问题:所有viewpager中的fragment都是那个最大的高度,如果你的fragment中view的高度很小的话,或者view的高度过大的话,会导致自身或者其他fragment中出现大面积空白。所以综上所述,我们要达到的效果是去除这空白,使viewpager的高度真正“自适应”。
四.具体实现
我们就拿viewpager+fragment,最常见的scrollview嵌套viewpager的例子,首先看我自定义的viewpager
package com.xxx.xxx.views;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import java.util.HashMap;
import java.util.Map;
/**
* Created by vipui on 16/8/25.
*/
public class CustomViewpager extends ViewPager {
private int current;
private int height = 0;
private boolean scrollble = true;
public CustomViewpager(Context context) {
super(context);
}
public CustomViewpager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void