安卓:ScrollView + ViewPager不正常工作

3
在我的安卓应用程序中,我想在ScrollView内实现PagerSlidingTab和ViewPager。布局文件如下所示。但是我面临一个奇怪的问题,只有标签条显示在顶部,没有ViewPagerFragment内容在屏幕上显示。我不知道问题出在哪里。如果我从布局中删除ScrollView,则可以完美地工作,但我想要所有内容都在ScrollView内。请帮我解决这个问题。
布局:
<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.danzim.diamond.classes.KenBurnsView
            android:id="@+id/newsHeaderKenburn"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:layout_alignParentTop="true"
            android:background="@color/black" />

        <com.astuetz.PagerSlidingTabStrip
            android:id="@+id/newsTabs"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_below="@+id/newsHeaderKenburn"
            android:background="@drawable/background_news_tab"
            app:pstsDividerColor="@color/transparent"
            app:pstsIndicatorColor="@android:color/white"
            app:pstsTextAllCaps="true" />

        <android.support.v4.view.ViewPager
            android:id="@+id/newsPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/newsTabs" />
    </RelativeLayout>

</ScrollView>

你尝试过使用RelativeLayout的wrap_content属性来适应内容大小而不是匹配父容器吗? - Hacketo
@Hacketo 是的,我已经尝试过了,但是不起作用。 - Zankhna
2个回答

5

我的代码有一个小错误。我更改了 ScrollView 代码,现在它正常工作。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

只需要在 ScrollView 元素中添加 android:fillViewport="true" 即可。我从这个链接中得到了答案:Is it possible to have a ViewPager inside of a ScrollView?


2
简单的解决方案是在您的ScrollView中添加android:fillViewport="true",但使用此布局存在更深层次的问题需要考虑。
您遇到的问题在于ScrollView包装其内容并“拥有”内部元素的调整大小。因此,当它为屏幕进行布局时,它会将相对布局调整大小以仅适合PagerSlidingTabStrip的标题信息。ViewPager的内容尚未添加,因此在调整相对布局的大小时不会考虑它。
建议的解决方案是将ScrollView放置在将位于ViewPager控件内的每个元素中。所以,您将要向ViewPage添加片段?只需确保ScrollView是这些布局中最顶部的控件即可。这使得以后想在ViewPager中放置例如ListView时,行为更少出乎意料,ListView和ScrollView彼此不喜欢,您只能拥有一个或另一个,您不能拥有ScrollView内滚动的任何其他内容。
希望这至少对您有所帮助。如果您需要更多关于此事的信息,请与我联系。

我明白你的解决方案,但是我必须将ViewPager放在ScrollView中,因为我想要整个页面滚动的功能,这个页面可能包含任何东西,比如ViewPager和其他控件。所以我在ViewPager外部使用了ScrollView。感谢你的回复。 - Zankhna
好的,很酷。只是想指出一下,在稍后将用于视图分页器中的片段中,您将无法使用列表视图或任何其他使用滚动功能的内容 :)。 fillViewport = true部分至少会确保滚动视图将填充屏幕上所有可用空间,而不仅仅是调整内容的大小。 - LeMoN.xaH
那么,如果您在ScrollView中使用wrap_content的ViewPager,就没有办法使整个视图可滚动了吗? - AdrianoCelentano
@AdrianoCelentano 抱歉来晚了,但我也遇到了同样的问题。当在ViewPager中使用ScrollView作为片段的根视图时,你找到解决这个问题的方法了吗? - PunitD

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