課題
あるViewの下にViewPagerがある。ViewPager内のリストをスクロールした際に、その上のViewもスクロールさせたい。
対策
CoordinatorLayoutとAppBarLayoutと合わせて使う。
<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"> <!-- AppBarLayout --> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" app:elevation="2dp"> <!--画面から消えるView --> <view app:layout_scrollFlags="scroll|enterAlwaysCollapsed /> <!--画面に残すView --> <view /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout>
ポイント
- スクロールViewと連動してスクロールさせたいViewはAppBarLayoutで囲む
- 画面から消える消えないの制御はapp:layout_scrollFlagsを使う
- スクロールを検知したいViewにapp:layout_behaviorをつける
- AppBarLayoutと連動させるViewは NestedScrollingChildをimplementsしている必要がある
- ListView、GridViewなどはNG. NestedScrollViewやRecyclerViewなどが対象
- JavaDocではSwipeRefreshLayoutはAndroid22.2.1の時点ではNestedScrollingChildをimplementsしていない
- ViewPagerなどViewGroup配下のスクロールViewも利用可能
- SwipeRefreshLayoutも使っている場合は少し面倒。