前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

CoordinatorLayoutとViewPagerの共存

課題

ある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も使っている場合は少し面倒。