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

背景

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

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

问题

我需要使用新的devise库,所以当滚动(只通过recyclerView),它会隐藏actionBar,让标签仍然显示。

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

事情是,如果我按照指导方针和样本,我有两个问题:

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

  2. 我无法find如何重新显示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> 

这些片段有一个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); 

它工作,但它也有一个问题:

  1. 当水平滚动时,我可以看到不可滚动片段的内容被截断,当去到新的片段(停止触摸屏幕,让它alignment片段),只有它缩小其大小,以适应正确空间。
  2. 工具栏不会重新显示。
  3. 如果由于在另一个片段上滚动而导致工具栏被隐藏,并且我现在处于不可滚动的片段上,则实际上获取的空间比预期的要less,所以它的底部有空的空间。

编辑:一个解决scheme是在不可滚动片段的内容的底部添加一个相同高度的操作栏(layout_height =“?actionBarSize”)的空视图。 但是,当操作栏被隐藏时,我可以看到视图,所以有空的空间。 我仍然需要知道如何在这种情况下重新显示操作栏。

这个问题

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

Solutions Collecting From Web of "如何只让特定片段在CoordinatorLayout的ViewPager中滚动?"