[Android] ViewPager2 중첩 스크롤 문제

곽호택·2021년 11월 4일
0

안드로이드

목록 보기
12/16
post-thumbnail
post-custom-banner

! 안드로이드 심화 스터디 2번째 시간. 이번에 내가 맡은 부분은 ViewPager2가 중첩 돼있을때의 스크롤이 되지 않는 문제를 해결하는 것이다.

1. 문제

안드로이드 공식 문서

위의 공식 문서 하단에 다음과 같이 나와있다.

스크롤 뷰와 이 스크롤 뷰를 포함하는 ViewPager2 객체의 방향이 같은 경우 ViewPager2는 기본적으로 중첩된 스크롤 뷰를 지원하지 않습니다.

그래서 이번 과제를 하며 BottomNavigation을 위해 VIewPager2를 사용했고,

TabLayout에서 화면이 스와이프 되도록 ViewPager2를 연동했는데,

BottomNavigation의 화면만 스와이프 되고 내부 TabLayout의

ViewPager2가 스와이프 되지 않는 문제가 생겼다.

2. 문제 해결방안

이를 해결하기 위해서 구글 공식 문서에 다음과 같이 나와있다.

방향이 동일한 ViewPager2 객체 내의 스크롤 뷰를 지원하려면 ViewPager2 객체의 requestDisallowInterceptTouchEvent()를 호출해야 한다.

코드는 다목적 맞춤 레이아웃 여기에 나와있다.

아래와 같이 NestedScrollableHost.kt 파일을 만든 뒤 그 안에 위의 링크 걸어 놓은 github 코드를 집어넣으면 된다.

그 뒤에 내가 원하는 자식 ViewPager2에다가

 <org.sopt.myapplication.util.NestedScrollableHost
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tl_home">

            <androidx.viewpager2.widget.ViewPager2
                android:id="@+id/vp_home_tab"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

        </org.sopt.myapplication.util.NestedScrollableHost>

다음과 같이 넣어주면 된다.

3. requestDisallowInterceptTouchEvent()란?

부모와 자식이 ScrollView가 되는 상황이라면 (여기서는 부모 ViewPager2와 자식 ViewPager2가 존재)

부모.requestDisallowInterceptTouchEvent(true)로 주어서 부모에게 TouchEvent를 빼앗기지 않도록 하는 메소드이다.

4. 주의

  • NestedScrolableHost 레이아웃은 스크롤이 가능한 자식을 하나만 가져야 한다!!
profile
잘하고싶다
post-custom-banner

0개의 댓글