Reputation: 567
I need to have a ViewPager
inside a ScrollView
but ViewPager
just does not appear when it's in ScrollView
, everything is ok when i don't use ScrollView
.
I've seen a couple questions like this being asked here on stackoverflow or on other sites and all of them have been answered that you have to put android:fillViewport="true"
to your scrollview to fix the problem, but this solution doesnt work for me, ViewPager
still does not appear even if i have android:fillViewport="true"
in my ScrollView
.
I guess something got changed in the android api's or something and this solution doesn't work anymore, does anyone know how i could possibly make a ViewPager
appear in a ScrollView
?
UPDATE: A working ScrollView layout XML:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/itemsViewPager2"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</android.support.v4.view.ViewPager>
</LinearLayout>
</ScrollView>
Upvotes: 22
Views: 14626
Reputation: 785
Just add the android:fillViewport="true" to your scroll view it will work
Upvotes: -2
Reputation: 380
public class YourScrollableViewPager extends ViewPager {
private static final int MATCH_PARENT = 1073742592;
private int currentPageNumber;
private int pageCount;
public YourScrollableViewPager(Context context) {
super(context);
prepareUI();
}
public YourScrollableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
prepareUI();
}
private void prepareUI() {
setOffscreenPageLimit(pageCount);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
if (getChildCount() != 0) {
View child = getChildAt(currentPageNumber);
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);
}
public void onPrevPage() {
onMeasure(MATCH_PARENT, 0);
}
public void onNextPage() {
onMeasure(MATCH_PARENT, 0);
}}
Upvotes: 9
Reputation: 56
I found solution for mine using "HorizontalScrollView"
instead of ScrollView
.
First create activity_main.xml
with below code, where you define ViewPager.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
And later create another left.xml
for defining your HorizontalScrollView
:
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res
/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher" />
</HorizontalScrollView>
Upvotes: 2
Reputation: 1815
I ran into a similar problem in the past. A View-Pager must have a set height (it cannot wrap-content). Since a ViewPager loads separate pages, and not all at once, it won't know what 'wrap-content' actually means. Setting the layout_height to fill_parent or a set dp allows the ViewPager to statically set it's height and react more accordingly within other layouts.
Upvotes: 17