NestedScrollView中的ViewPager


111

我需要创建一个类似于Google Newsstand的界面,该界面是一种在折叠的标题(垂直滚动)上的ViewPager(水平滚动)。我的要求之一是使用Google IO 2015上提供的新设计支持库。(http://android-developers.blogspot.ca/2015/05/android-design-support-library.html

基于Chris Banes(https://github.com/chrisbanes/cheesesquare)创建的示例,我已经达到了可以执行折叠行为的程度,但是具有基本的LinearLayout(无水平滚动)。

我试图用ViewPager替换LinearLayout,但出现黑屏。我玩过:宽度,重量和各种视图组,但是..仍然是空白屏幕。似乎ViewPager和NestedScrollView彼此不喜欢。

我通过使用Horizo​​ntalScrollView尝试了一种解决方法:它可以工作,但是我放弃了PagerTitleStrip功能的好处,也没有将注意力集中在单个面板上(我可以在两个面板之间水平停​​止)。

现在,我不再有任何想法,如果有人可以引导我找到解决方案...

谢谢

这是我最新的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/header_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include
                layout="@layout/part_header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/activity_main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/activity_main_nestedscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/activity_main_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFA0"/>


    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

您是否尝试过将您的产品包装在ViewPager里面LinearLayout?只是好奇是否会ViewPager正确处理。
CzarMatt

是的,我尝试过,但结果仍然相同。我对许多组件进行了许多测试,但无论层次结构如何,都不会在NestedScrollView中呈现ViewPager
Kyso84 2015年

我刚刚创建了一个ViewPager内部NestedScrollView只有一个布局的测试应用程序-看起来工作正常。我也能够DrawerLayout成功进入。也许代码的另一方面阻止了您想要的功能。想要分享更多您的资源?
CzarMatt

哇,所以您可以向左/向右和向上/向下滑动?我只是使用FragmentPagerAdapter在我的寻呼机中显示片段。您可以共享示例代码吗?
Kyso84

我在此处粘贴了一个简单的示例布局:pastebin.com/jXPw6mtf 编辑:您可以在中加载所需的任何片段ViewPager。我能够上下滚动视图,以及ViewPager向左/向右滚动。
CzarMatt 2015年

Answers:


128

我遇到这个问题,我通过解决它 setFillViewport (true)

<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

活动中

  NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

在此处输入图片说明


31
请注意,也可以在XML中进行设置,只需将其添加android:fillViewport="true"NestedScrollView对象中即可。该文档描述了这个属性作为Defines whether the scrollview should stretch its content to fill the viewport.
Krøllebølle

7
这不能解决占位符片段中的滚动问题
Atieh 2016年

3
谢谢!我再次坐下android:fillViewport="true"NestedScrollView和里面fragment我有一个listView,我坐在android:nestedScrollingEnabled="true"..修正了滚动问题
radubogdan

@KrøllebølleNestedScrollView没有此属性,您必须以编程方式设置它。

是的,这对我有用。我在NestedScrollView中将viewpager的高度设置为match_parent时出现问题,它没有显示视图。
Waheed Nazir

70

好的,我使用ViewPager和进行了一个小演示NestedScrollView。我面临的问题是与高度ViewPagerListView。所以我做了一个小的修改ListViewViewPager's高度测量。

如果有人想看一下代码,请访问以下链接:https : //github.com/TheLittleNaruto/SupportDesignExample/

输出:

在此处输入图片说明


如果片段没有列表视图,则该列表不起作用,如果所有片段的项数均相同,则即使forlistview也无法运行。
Pankaj Arora 2015年

@Dev问题在于View Pager的高度,因此,无论它在第一个片段中采用的高度如何,其他片段的高度也将相同。在这种情况下,您必须找出一种方法来动态设置ViewPager的高度,并考虑每个片段的项目集。
TheLittleNaruto

3
我参加聚会可能有点晚了,但是,我今天正在研究这个问题,(主要)是在ViewPager 其父视图上添加app:layout_behavior =“ @ string / appbar_scrolling_view_behavior” 每个片段。
Graeme

1
毫无疑问,这可行,但这是否会使问题变得过于复杂?我通过摆脱NestedScrollView并使用a 解决了此问题LinearLayout。什么将是具有的优势NestedScrollViewLinearLayout如果整个目的是滚动ViewPager中的内容?如果我错了,请纠正我。:x谢谢
抽筋2015年

1
非常感谢!我正要拔头发,而您的WrapContentHeightViewPager就像一个饰物。我欠你一个人情!
马瓦玛顿


27

与其将ViewPager放在NestedScrollView内,不如反过来做。

将NestedScrollView放在ViewPager内的子视图中,本质上就是Fragment的布局。如果您的Fragment的列表布局非常简单,则很有可能甚至不需要使用NestedScrollView。

示例布局

活动的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="@dimen/app_bar_height"
                android:scaleType="centerCrop"
                android:src="@drawable/my_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/content_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

如果不需要TabLayout,则可以放弃LinearLayout并使ViewPager独立。但是请确保app:layout_behavior="@string/appbar_scrolling_view_behavior"在ViewPager属性中使用。

简单片段的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

复杂片段的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"/>
    </RelativeLayout>
</android.support.v4.widget.NestedScrollView>

示例应用程序:CollapsingToolbarPoc

在此处输入图片说明


这就是为我做的。谢谢!
rjr-apps

嘿Ino,这似乎可行,但是当我在TabLayout顶部添加一个视图时,它就坏了。你能帮些忙吗?
hushed_voice

你救了我的日子。:)
androidXP

20

有同样的问题。

将NestedScrollView放在ViewPager 周围时,它将无法工作。

DID的工作原理是将NestedScrollView 放在我正在ViewPager中加载的片段的布局中。

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@id/fragment_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"
            android:orientation="vertical">
    ...Content...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>


如果内容是另一个NestedScrollView的协调器布局,是否可以正常工作?父CoordinatorLayout是否侦听那里的滚动事件?
Atieh,2016年

这为我工作。我将NestedScrollView添加到ViewPager的每个项目中,而不是ViewPager。谢谢。
jerogaren

根据您的解决方案,我在片段中有swipefreshlayout,我将NestedScrollview放在片段中,位于swipeRefreshLayout上方。然后未加载数据。它没有工作。
Palak Darji 2016年

16

您可以这样尝试,viewpager可以正常工作,但是viewpager的高度是固定的。

我仍在寻找更好的解决方案...,所以请让我知道任何一点都可以做得更好,谢谢

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="800dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

您是否尝试将其封装到“ android.support.design.widget.CoordinatorLayout”和折叠的工具栏中?
Kyso84 2015年

您的解决方案似乎证明了问题出在高处。发现任何改进之处@Paul?
jasxir 2015年

3
这对我有用,但我还必须在nestedview上调用setFillViewport(true)。
larrytech '16

12

我遇到了同样的问题,只是做了一些修改就解决了。ViewPager在中不起作用NestedScrollView。只需将您ViewPager作为您孩子的直接子代即可CoordinatorLayout。然后,每个ViewPager的FragmentNestedScrollView内容都应包含在中而已。


即使内容是另一个NestedScrollView的协调器布局?
Atieh,2016年

1
片段listview数据没有以这种方式加载!
Palak Darji's

5

您不需要使用NestedScrollView来产生视差效果。尝试这样的事情:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways"/>

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_tab_layout"
            android:fillViewport="false"
            app:tabMode="fixed"/>
     </android.support.design.widget.AppBarLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/my_view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

3
只要您所有的ViewPager片段都是ether RecyclerView或,这将起作用NestedScrollView。如果不是(例如ListView),请致电Lollipop及更高版本的解决方法listView.setNestedScrollingEnabled(true)
AndyDeveloper

终于可以在不添加额外滚动容器的情况下运行了!顺便说一句,您也可以在xml中设置此setNestedScrollingEnabled(true):android:nestedScrollingEnabled =“ true”
Analizer

1
如果我运行我的应用,请在一个选项卡中折叠工具栏,然后切换选项卡,然后将其向下拉,这是空的。处于非折叠状态时,必须切换选项卡才能再次将其恢复。如此接近,却至今:(
我-

4

我有一个带有应用程序工具栏的布局,其下面带有NestedScrollView,然后在嵌套工具栏内部是一个LinearLayout,在LinearLayout下是一个视图分页器。想法是NestedScrollView内部的LinearLayout是固定的-您可以在视图分页器的视图之间左右滑动,但此内容至少在水平方向上不会移动。由于嵌套的滚动视图,您仍然应该能够垂直滚动所有内容。那是主意。因此,我将嵌套的NestedScrollView高度设置为match_parent,填充视口,然后将所有子布局/ ViewPager设置为wrap_content。

在我脑海中是对的。但这没有用-ViewPager允许我向左/向右走,但没有垂直滚动,无论viewpager页面内容是否被推到当前屏幕的下方。事实证明,这基本上是因为ViewPager不尊重其各个页面上的wrap_content。

我通过将ViewPager子类化以使其根据当前选定的项目改变高度来解决这个问题,迫使其表现得像layout_height =“ wrap_content”:

public class ContentWrappingViewPager extends ViewPager {

    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            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);
    }
}

解决方案受到此答案的启发。为我工作!


但是滚动视图会自动滚动到顶部?如何解决呢?
Vivek Kumar

4

只需将这一行放在NestedScrollView中

android:fillViewport="true"

谢谢。如果我想直接触摸CollapsingToolbarLayout进行滚动怎么办?
Pratik Saluja,

3

我从主布局中删除了NestedScrollView,并将其作为Parent插入了我应该在ViewPager中加载的所有Fragment布局中,从而为我解决了此问题。


3

使用下面的定制类来解决您的问题。不要忘记在pagechangelistener上调用onRefresh()方法。

public class ContentWrappingViewPager extends ViewPager
{
    private int width = 0;
    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int height = 0;
        width = widthMeasureSpec;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            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 onRefresh()
    {
        try {
            int height = 0;
            if (getChildCount() > getCurrentItem()) {
                View child = getChildAt(getCurrentItem());
                child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                if(h > height) height = h;
            }

            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
            layoutParams.height = heightMeasureSpec;
            this.setLayoutParams(layoutParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2

我有一个类似的问题(但没有CollapsingToolbarLayout,只是一个简单的Toolbar+ TabLayoutAppBarLayout)。我想要的工具栏向下滚动的内容时的视线滚出ViewPagerNestedScrollView

我的布局是这样的:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <android.support.v4.widget.NestedScrollView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                android:layout_gravity="fill_vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

此布局未按预期工作,但我通过简单地摆脱NestedScrollView并使用a LinearLayout来解决了该问题。它立即在Android支持库v23.1.0上为我工作。布局的最终​​结果如下:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <LinearLayout
            android:orientation="vertical"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

PS:这些实际上是我项目中的两个布局文件。我将它们复制并粘贴到此处,并试图像在单个文件中一样构造它们。很抱歉,如果我在粘贴粘贴时搞砸了,但是如果是这种情况,请告诉我,以便我进行修复。


1

以下应确保查看寻呼机的适当高度。该片段是视图分页器提供的第一个片段。

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <fragment
            class="com.mydomain.MyViewPagerFragment"
            android:id="@+id/myFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

1

我也有同样的愿望,在中嵌套ViewPager一个NestedScrollView。但这对我也不起作用。在我的情况下,处于ViewPagera内,Fragment因此我可以根据与抽屉的交互来切换内容。当然,AppBar,折叠等以及支持库的所有新功能都必须起作用。

如果用户在寻呼机中垂直滚动页面,我希望其他页面也以相同的方式滚动,以给用户整体感觉,即寻呼机本身已滚动。

我所做的工作是可行的,因为我不再将ViewPager内部嵌入NestedScrollView,而是将包含的片段的内容嵌入了NestedScrollView

然后,如果在一个片段中滚动,则将新的滚动位置通知容器,并在其中存储它。

最后,在从寻呼机检测到的向左或向右滑动(使用addOnPageChangeListener查找拖动状态)时,我通知目标左或右片段必须滚动(根据其容器知识)才能与我来自的片段对齐。


因此,基本上您编写了自己的ViewPager实现?您可以在此共享代码吗?
2015年

我做了类似的事情(如果我理解正确的话),那就是在您的协调器布局中进行线性布局,其中包含tablayout(如果需要)和viewpager,而不是嵌套的scrollview。然后,片段本身将嵌套的滚动视图作为其根元素。这对我有用,但是我宁愿只拥有一个nestedscrollview,而不是在每个片段中都重复它。
克里斯(Chris)

0

我知道一个可行的解决方案:您将Activity与CoordinatorLayout一起使用,并将FrameLayout与容器一起使用。然后。使用片段管理器将片段放入容器中。例如我的代码:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="@dimen/toolbar_height"
        android:background="?attr/colorPrimary"
        android:gravity="center">

    </android.support.v7.widget.Toolbar>


</android.support.design.widget.AppBarLayout>

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</FrameLayout>

和片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后使用FragmentManager

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();

我认为LinearLayout在这里Fragment的布局内是不必要的。看到我的答案,我在Activity的布局中使用a LinearLayout而不是a FrameLayout,并且片段的根是ViewPager(无换行布局)。
抽筋

0

花了几个小时尝试了以上所有建议之后,终于使它生效了。关键是把NestedScrollViewPageViewer,并设置layout_behavior'@string/appbar_scrolling_view_behavior'BOTH意见。最终的布局就像

<CoordinatorLayout>
    <ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <Content>...</Content>
        </NestedScrollView>
    </ViewPager>
    <AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>


0

实际上,NestedScrollView不需要直接成为CoordinatorLayout中的CollapsingToolbarLayout的同级对象。我已经取得了一些真正的成就。appbar_scrolling_view_behavior可分为2个嵌套片段。

我的活动布局:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

                <include
                    layout="@layout/toolbar"/>

            </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

在“容器” frameLayout中,我将此片段放大了:

<android.support.constraint.ConstraintLayout>

    ... some content ...

    <android.support.v4.view.ViewPager/>

    ...

</android.support.constraint.ConstraintLayout>

ViewPager中的片段如下所示:

<RelativeLayout>

    <android.support.v7.widget.RecyclerView/>

    ....

</RelativeLayout>

事实上,NestedScrollView在CoordinatorLayout子级层次结构中是如此深入,而滚动行为仍然令人惊讶。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.