安卓在ScrollView中嵌套ViewPager时,设置ViewPager的单个页面高度随内容变化

在开发过程中,有时候页面布局比较复杂,会使用到ScrollView和ViewPager,如果不进行处理,会出现不显示ViewPager的子页面,或者子页面高度一样,内容显示不全,或者是留白太多。我的需求是需要在页面下面加一个可以左右滑动的分栏,而且两个分类的页面高度不一致且不确定。一开始没有考虑,直接就使用了ViewPager,但是子页面什么都没有显示,查了很多资料,说的都是这个问题。解决的方法也很简单,我们只需要去计算一下每个子页面的高度,然后保存起来,在每次切换页面的时候,去设置子页面的高度就可以了,这里自定义了一个ViewPager,也是参考网上大神的,出处忘记了,但是很好用啊。代码如下:

public class CustomViewPager extends ViewPager{
    private HashMap mMap = new LinkedHashMap<>();

    private int current;
    private int height = 0;

    private boolean scrollable = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if (mMap.size() > current) {
            View child = getChildAt(current);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height = child.getMeasuredHeight();
        }

//        得到ViewPager的MeasureSpec,使用固定值和MeasureSpec.EXACTLY,
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    }

    // 重置页面高度
    public void resetHeight(int current) {
        this.current = current;
        if (mMap.size() > current) {
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
            if (layoutParams == null) {
                layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
            } else {
                layoutParams.height = height;
            }
            setLayoutParams(layoutParams);
        }
    }

    public void setObjectForPosition(View view, int position) {
        mMap.put(position, view);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (!scrollable) {
            return true;
        }
        return super.onTouchEvent(ev);
    }

    public boolean isScrollable() {
        return scrollable;
    }

    public void setScrollable(boolean scrollable) {
        this.scrollable = scrollable;
    }
}

代码相对比较简单,应该都可以看懂的,自定义完之后,使用的方式和原生的ViewPager是一样的,这里不做多余的介绍,只需要在使用的时候多加一个方法,去设置切换页面时调用重置的方法:

mVp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        mVp.resetHeight(position);

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
// 默认选中第一个
mVp.resetHeight(0);

这样子就可以做到在切换页面时,子页面的高度和内容的高度一样了。

你可能感兴趣的:(安卓在ScrollView中嵌套ViewPager时,设置ViewPager的单个页面高度随内容变化)