解决ViewPager高度无法wrap_content问题

来源:互联网 发布:数据统治世界 百度云 编辑:程序博客网 时间:2024/05/20 10:56

直接上解决方法,需要重写ViewPager中的onMeasure方法。

/** * ViewPager wrapContent解决方案 */public class WrapContentHeightViewPager extends ViewPager {    /**     * Constructor     *     * @param context the context     */    public WrapContentHeightViewPager(Context context) {        super(context);    }    /**     * Constructor     *     * @param context the context     * @param attrs the attribute set     */    public WrapContentHeightViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }//    @Override//    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);////        // find the first child view//        View view = getChildAt(0);//        if (view != null) {//            // measure the first child view with the specified measure spec//            view.measure(widthMeasureSpec, heightMeasureSpec);//        }////        setMeasuredDimension(getMeasuredWidth(), measureHeight(heightMeasureSpec, view));//    }    @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);    }    /**     * Determines the height of this view     *     * @param measureSpec A measureSpec packed into an int     * @param view the base view with already measured height     *     * @return The height of the view, honoring constraints from measureSpec     */    private int measureHeight(int measureSpec, View view) {        int result = 0;        int specMode = MeasureSpec.getMode(measureSpec);        int specSize = MeasureSpec.getSize(measureSpec);        if (specMode == MeasureSpec.EXACTLY) {            result = specSize;        } else {            // set the height from the base view if available            if (view != null) {                result = view.getMeasuredHeight();            }            if (specMode == MeasureSpec.AT_MOST) {                result = Math.min(result, specSize);            }        }        return result;    }}


0 0
原创粉丝点击