如何只让特定片段在CoordinatorLayout的ViewPager中滚动?

and*_*per 11 android android-fragments android-viewpager android-toolbar android-coordinatorlayout

背景

我有一个viewPager,有3个片段和标签.每个片段都有一个(自己的)介绍阶段,它没有任何可滚动的内容.

离开介绍阶段后,有一个用户可以滚动的recyclerView.

问题

我需要使用新的设计库,以便在滚动时(仅通过recyclerView),它将隐藏actionBar并让标签仍然显示.

当用户转到没有可滚动内容的片段时,actionBar应该重新出现,类似于"Google Play报亭".事实上,我甚至乐意拥有他们拥有的东西:只要你开始向左/向右滑动,就会重新显示操作栏.

事实上,如果我遵循指南和样本,我有两个问题:

  1. 片段的不可滚动阶段在底部被截断,就好像它可以滚动一样.

  2. 我找不到如何重新显示actionBar,并让它停留在那里直到我切换到可滚动内容(通过切换到另一个片段,或当当前片段的内容变为可滚动内容时).

我试过的

这是活动的当前布局XML文件的简短片段:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/activity_main__coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/activity_main__appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:theme="?attr/actionBarTheme">

            <android.support.v7.widget.Toolbar
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                android:layoutDirection="ltr"
                android:theme="?attr/actionBarTheme"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                tools:ignore="UnusedAttribute"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="?attr/colorPrimary"
                app:tabGravity="fill"
                app:tabIndicatorColor="#FFffffff"
                app:tabIndicatorHeight="3dp"/>
        </android.support.design.widget.AppBarLayout>

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

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

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

    <include
        layout="@layout/sliding_menu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"/>

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

片段具有ViewAnimator的布局,只需在阶段之间切换,而其中一个是不可滚动的内容,另一个是RecyclerView.

我试图添加一个NestedScrollView/ScrollView不可滚动的内容,并强制它填充自己,使用android:fillViewport ="true",但它不起作用.对于ScrollView,它甚至不允许滚动.

编辑:我尝试过的另一件事是在viewPager上使用addOnPageChangeListener,以便在onPageSelected中我可以设置工具栏的标志:

AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) mToolbar.getLayoutParams();
params.setScrollFlags(!needScrolling? 0 : LayoutParams.SCROLL_FLAG_SNAP | LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | LayoutParams.SCROLL_FLAG_SCROLL);
Run Code Online (Sandbox Code Playgroud)

它有效,但它也有问题:

  1. 在水平滚动的同时,我可以看到不可滚动片段的内容被截断,当转到新片段时(停止触摸屏幕,让它捕捉到片段),只有它缩小了它的大小以适应正确的空间.
  2. 工具栏无法重新显示.
  3. 如果工具栏由于在另一个片段上滚动而被隐藏,而我现在在不可滚动的片段上,它实际上填充的空间比预期的要少,所以它底部有空的空间.

编辑:一种解决方案是在不可滚动的片段内容的底部添加相同高度的操作栏(layout_height ="?actionBarSize")的空视图.但是,当隐藏操作栏时,我可以看到视图,因此存在空白区域.我仍然需要知道如何在这个案例中重新显示操作栏.

这个问题

如何为工具栏设置不同的行为,以便它会重新显示并停留在某些状态,但只有在当前片段上显示RecyclerView时才可滚动?