210202
BottomNavigation + Jetpack Navigation 버그findNavController().navigate()로 이동한 뒤 BottomNavigation으로 이동시 원래 Fragment로 돌아오지 않음 본문
BottomNavigation + Jetpack Navigation 버그findNavController().navigate()로 이동한 뒤 BottomNavigation으로 이동시 원래 Fragment로 돌아오지 않음
dev210202 2022. 7. 19. 20:59<발생 시나리오>
기본 조건
- A activity에 B,C,D 라는 fragment가 있고 A의 BottomNavigation에서는 B,C,D로 이동할 수 있다.
- A 액티비티의 초기 화면은 B fragment이다.
순서
1. B fragment에 있는 이동 버튼을 눌러 findNavController().navigate() 메소드로 C로 이동한다.
2. 다시 C에서 B로 이동하기 위해서 A의 BottomNavigation을 눌러 B로 이동한다.
3. 이때 B로 이동했음에도 C 화면이 나오게된다.
<원인>
Jetpack Navigation은 Fragment 이동시에 이전 Fragment이 포함된 backstack을 자동으로 관리한다.
처음 화면이 backstack에 배치되고 그 후 이동하는 navigate()가 실행되서 이동할 때 마다 backstack위에 해당 fragment가 놓여진다.
BottomNavigation으로 fragment를 이동하게 되면
backstack은 다음과 같다.
처음 Fragment가 실행되면 backstack에 기본적으로 처음 실행된 Fragment가 들어가게 된다.
그 다음 B fragment에서 C로 이동을 하게되면 backstack은 B fragment C fragment가 존재하게된다.
이후 다시 B로 오면 backstack에서 C를 제거한다.
하지만 findNavController().navigate()를 사용해서 fragment를 이동하게 되면 backstack은 다음과 같다.
<해결책 1>
따라서 backstack에서 이동하는 액션에 fragment를 backstack에서 지우게 해주면 된다.
<fragment
android:id="@+id/프래그먼트명"
android:name="프래그먼트명"
android:label="프래그먼트명" >
<action
app:popUpTo="@id/프래그먼트명"
app:popUpToInclusive="true"
android:id="@+id/action_프래그먼트명_이동할프래그먼트명"
app:destination="@id/이동할프래그먼트명" />
</fragment>
하지만 아주 희한한 점은 똑같은 과정을 C -> D -> C로 반복하면 문제없이 backstack에서 지워진다는 점이다.
이게 버그인것같아 찾아보니 stackoverflow에도 나와 같은 질문이 있었다.
android 안드로이드 - BottomNavigationView - 스택 오버플로가있는 탐색 버그 (stackoverflow.com)
<해결책 2>
stackoverflow에서 찾은 해답은 현재 navigation의 버전을 다운그레이드 하는 방법이다.
현재 버전이 2.5.0인데 2.3.5로 변경했더니 감쪽같이 문제가 사라졌다.
<결론>
버그가 맞으며 backstack에서 제거하는 방식 혹은 버전을 다운그레이드하는 방법으로 해결 가능하다.
'Android' 카테고리의 다른 글
Material CalendarView XML Preview 오류 (0) | 2023.11.27 |
---|---|
안드로이드 크기 단위(dp,sp 등) 비교 (0) | 2023.09.24 |
[LiveData] Fragment간 ViewModel 공유 시 LiveData의 값이 안바뀌는 현상 (0) | 2021.04.04 |
[ViewModel] ViewModel 사용이유 , ViewModelProvider 작동방식 (0) | 2021.03.24 |
[Retrofit guide] Retrofit 초보자를 위한 가이드(ppt와 설명, 예시까지) (2) | 2021.03.11 |