ScrollView 中的 ViewPager

22
我想在一个ScrollView中放置一个ViewPager,但是当ViewPager放在ScrollView中时,它就不显示了,没有使用ScrollView时一切都正常。
我看到有几个类似的问题在stackoverflow或其他网站上被问到,并且所有这些问题都被回答说你必须将android:fillViewport="true"设置到你的ScrollView中以解决问题,但是这个解决方案对我并不起作用,即使我在我的ScrollView中有android:fillViewport="true",ViewPager仍然不会出现。
我猜测Android API或其他东西发生了变化,这个解决方案不再起作用了,有人知道我怎样才能让ViewPager出现在ScrollView中吗?
更新:一个可行的ScrollView布局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>

1
你应该提供更多关于你的问题的信息,例如你目前正在尝试让它工作的布局。你是否尝试为ViewPager的高度定义一个精确的像素值? - Zsombor Erdődy-Nagy
哇,谢谢你的建议,我稍微调整了一下高度和宽度属性,实际上很容易就解决了问题。我更新了原来的问题,并提供了可行的ScrollView XML布局。 - boogieman
@boogieman请将其作为答案放入并加以标记。 - Warpzit
你可以在这里找到解决方案。 - Gaurav Arora
4个回答

17

我过去也遇到了类似的问题。View-Pager必须具有固定的高度(不能使用wrap-content)。由于ViewPager加载单独的页面,而不是全部加载,因此它不知道'wrap-content'实际上是什么意思。将layout_height设置为fill_parent或一组dp允许ViewPager静态地设置其高度,并在其他布局中更加灵活地响应。


4
唯一起作用的是在dp中显式设置一个值,即使match_parent也不起作用。 - timemanx

9
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);
}}

谢谢,这对我有用。但是我遇到了一些问题。 我在视图页面中有两个片段。一个有NestedScrollView,另一个有RecyclerView。所以使用那段代码时,RecyclerView的fling会出现问题。 - Andrew

2
我使用"HorizontalScrollView"替代ScrollView,解决了我的问题。
首先创建activity_main.xml文件,并定义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>

然后创建另一个left.xml文件来定义您的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>

-2
只需在您的滚动视图中添加android:fillViewport="true",它就可以正常工作。

请在回答前阅读问题。他已经提到它对他不起作用。 - Bibin Johny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接