[Android] ViewPager2가 중첩일 경우 내부 ViewPager2가 스크롤 되지 않는 문제해결

이유정·2021년 8월 20일
0
post-thumbnail

1. 문제상황

  • tabLayout에 화면이 스와이프되도록 ViewPager2를 연동시킨 후,
    해당 fragment 위에 다시 ViewPager2를 달면 둘의 방향이 동일할 경우 외부에 있는 ViewPager2만 스와이프가 되고, 내부에 있는 ViewPager2의 경우 스와이프되지 않는 문제가 발생함.

2. 문제 해결 _ google android developer 참고

viewPager2 중첩 스크롤 관련 링크

해당페이지의 하단을 보면, ViewPager2 스크롤 보기가 ViewPager2가 포함된 외부 개체와 방향이 같을 경우 중첩된 스크롤 보기를 기본적으로 지원하지 않는다고 나와있다.

이러한 상황에서 내부 ViewPager의 스크롤을 지원하기 위해서는 ViewPager2 객체의 requestDisallowInterceptTouchEvent()을 호출해야한다.

그리고 위의 내용을 적용한 구글의 예제코드를 git을 통해 제공하고 있다.

3. 사용법 :


- 먼저 구글에서 제공해준 (requestDisallowInterceptTouchEvent()를 호출하고 있는) NestedScrollableHost.kt를 추가해준다.
- xml 레이아웃 단에서는 위에서 추가한 클래스를 레이아웃으로 사용한다.

```
<androidx.viewpager2.integration.testapp.NestedScrollableHost
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/first_rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF" />
</androidx.viewpager2.integration.testapp.NestedScrollableHost>
```
  • 이렇게 설정해주고 사용할 경우, 동일 방향 중첩스크롤일 경우도, 내부 ViewPager2가 잘 스크롤 되는 것을 확인할 수 있다.


4. 주의점

  • NestedScrolableHost 레이아웃은 스크롤이 가능한 요소 하나만을 "유일한 자식"으로 가져야 한다. ( 해당 레이아웃 안에 자식 여러개 X )

  • 해당 솔루션의 경우 수평 ViewPager2안에 수직 RecyclerView 안에 있는 수평 RecyclerView와 같은 복합적인 수준의 중첩 스크롤 가능 요소는 제한이 있음.
profile
개인 공부 블로그

0개의 댓글