Reputation: 337
I have a ViewPager
Inside a ScrollView
along with other components. When I give a height to ViewPager
in XML
then the ScrollView
works normally but I cant give height for ScrollView
as the ViewPager
should expand according to the page height. I have implemented a runnable which will expand the ViewPager
on runtime.
The problem is I am not able to scroll the outer ScrollView
which is holding the ViewPager
XML =======
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/img1"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="150dp"
android:id="@+id/img_1"
/>
<ViewPager
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ViewPager>
</ScrollView>
JAVA to dynamically set height for viewpager
viewpager.post(new Runnable() {
@Override
public void run() {
ViewGroup.LayoutParams lp = viewpager.getLayoutParams();
lp.height = viewpager.getChildAt(viewpager.getCurrentItem()).getHeight();
viewpager.setLayoutParams(lp);
}
});
Upvotes: 1
Views: 2157
Reputation: 111
I found good solution here
Anyway, it is code from article:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
int currentPagePosition=0;
View child = getChildAt(currentPagePosition);
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);
}
You need to create your own custom view pager extended from ViewPager and override onMeasure method
Upvotes: 1
Reputation: 5531
This question is answered here: Dynamic height viewpager.
Anyway I'm going to give you the code that you need to solve it:
public class CustomPager extends ViewPager {
private View mCurrentView;
public CustomPager(Context context) {
super(context);
}
public CustomPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mCurrentView == null) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int height = 0;
mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = mCurrentView.getMeasuredHeight();
if (h > height) height = h;
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void measureCurrentView(View currentView) {
mCurrentView = currentView;
requestLayout();
}
public int measureFragment(View view) {
if (view == null)
return 0;
view.measure(0, 0);
return view.getMeasuredHeight();
}
}
Like owner's answers said:
ViewPager needs to be re-measured each time a page is changed. Good place to do this is setPrimaryItem function of PagerAdapter
public class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
private int mCurrentPosition = -1;
public MyPagerAdapter(FragmentManager fm) {
super(fm);
this.fragments = new ArrayList<Fragment>();
fragments.add(new FirstFragment());
fragments.add(new SecondFragment());
fragments.add(new ThirdFragment());
fragments.add(new FourthFragment());
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position != mCurrentPosition) {
Fragment fragment = (Fragment) object;
CustomPager pager = (CustomPager) container;
if (fragment != null && fragment.getView() != null) {
mCurrentPosition = position;
pager.measureCurrentView(fragment.getView());
}
}
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
You can find all code here
Upvotes: 1
Reputation: 804
I think you must remove your java code. but add this properties to your scrollview xml:
android:fillViewport="true"
Upvotes: -1