210202

BottomNavigation + Jetpack Navigation 버그findNavController().navigate()로 이동한 뒤 BottomNavigation으로 이동시 원래 Fragment로 돌아오지 않음 본문

Android

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)

 

Navigation bug with BottomNavigationView

Navigation from my BottomNavigationView isn't working correctly and I'm stumped. When I first open the app, it works fine. I click a button in the BottomNavigationView and the corresponding fragme...

stackoverflow.com

<해결책 2>

stackoverflow에서 찾은 해답은 현재 navigation의 버전을 다운그레이드 하는 방법이다.

현재 버전이 2.5.0인데 2.3.5로 변경했더니 감쪽같이 문제가 사라졌다.

 

 

<결론>

버그가 맞으며 backstack에서 제거하는 방식 혹은 버전을 다운그레이드하는 방법으로 해결 가능하다.

Comments