-
반응형
앱을 개발하다가 구글 meterial 라이브러리 중 CollapsingToolbarLayout을 사용했다.
CoordinatorLayout 내부에 상단에 쓸 AppBarLayout 을 쓰고 그 하단에 뷰가 보일 페이지를 구성한다.
나는 하단에 ViewPager2 를 사용하였기 때문에 내부를 NestedScrollView로 감싸고, 그 NestedScrollView에 behavior 옵션을 지정했었다.
app:layout_behavior="@string/appbar_scrolling_view_behavior"
아래와 같은 구조로 만들었었는데 스크롤에 이슈가 생겼다.
<androidx.coordinatorlayout.widget.CoordinatorLayout> <com.google.android.material.appbar.AppBarLayout> <com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.core.widget.NestedScrollView> <androidx.viewpager2.widget.ViewPager2/> </androidx.core.widget.NestedScrollView> </androidx.coordinatorlayout.widget.CoordinatorLayout>
손으로 꾹 누른 상태로 스크롤 하면 상단 AppBar가 움직이지 않고, 스크롤 직후 떼면 관성에 의해서만 AppBar가 동작하는 이슈였다.
굉장히 많은 삽질과 스택오버플로우의 검색으로 2시간 반만에 문제를 해결했다...😭
무려 7년 7개월 전 스택오버플로우 게시글에서 힌트를 찾을 수 있었다.
이 힌트를 보고 구조를 바꾸었다.
<androidx.coordinatorlayout.widget.CoordinatorLayout> <com.google.android.material.appbar.AppBarLayout> <com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:nestedScrollingEnabled="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </androidx.coordinatorlayout.widget.CoordinatorLayout>
ViewPager에 behavior 속성을 넣고 ViewPager 내부에서 사용하는 프래그먼트에 NestedScrollView를 넣었다.
fragment.xml
<androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> ''' 중략 ''' </androidx.core.widget.NestedScrollView>
그러자 드디어 원하는대로 동작 성공!!
우선, 두시간 삽질의 원인은 CollapsingToolbarLayout 을 사용하는 xml에 있는 스크롤뷰만 인식한다고 생각했었는데 이게 큰 오산이었다. 뷰페이저에 사용하는 프래그먼트의 스크롤도 인식하도록 구글이 구현해두었을줄이야..
어쨌든 이상한건 밖에 있는 스크롤뷰는 제대로 인식하지 못하고 내부에 있는 스크롤뷰만 제대로 인식하는게 이상하긴 한데 동작해서 좋다.
반응형'개발 > Android' 카테고리의 다른 글
이펙티브 코틀린 : 1부 좋은 코드 (0) 2023.02.06 [Android] 카카오 로그인을 구현하면서 경험한 시행착오 (0) 2023.01.29 [Android | Kotlin] Bottom Sheet Dialog 개발하기 (0) 2023.01.17 [Android | Kotlin] 이모지/이모티콘을 TextView에 적용하기 (0) 2023.01.15 [Android | 앱 성능 최적화] GPU 렌더링 속도 프로파일링 및 레이아웃 평탄화 (2) 2023.01.12 댓글