How to wrap the height of a ViewPager to the height of its current Fragment?

前端 未结 6 1530
轻奢々
轻奢々 2020-11-27 14:04

I made a ScrollView containing a ViewPager, but the ViewPager does not grow in height. When the content inside the ViewPager is too big, it get \'pucht\'(?) inside, the tabl

6条回答
  •  余生分开走
    2020-11-27 14:31

    You can customize the ViewPager to resize the ViewPager to it's current page size on page swipe.

    You can use the below code.

    public class WrapContentViewPager extends ViewPager {
    
        private int mCurrentPagePosition = 0;
    
        public WrapContentViewPager(Context context) {
            super(context);
        }
    
        public WrapContentViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            try {
                boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
                if (wrapHeight) {
                    View child = getChildAt(mCurrentPagePosition);
                    if (child != null) {
                    child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                    int h = child.getMeasuredHeight();
    
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
        public void reMeasureCurrentPage(int position) {
            mCurrentPagePosition = position;
            requestLayout();
        }
    }
    

    Declare it in xml:

        
        
    

    After that call reMeasureCurrentpage function on page swipe.

    final WrapContentViewPager wrapContentViewPager = (WrapContentViewPager) findViewById(R.id.view_pager);
    
    wrapContentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
        }
    
        @Override
        public void onPageSelected(int position) {
            wrapContentViewPager.reMeasureCurrentPage(wrapContentViewPager.getCurrentItem());
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
    
        }
    });
    

提交回复
热议问题