관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] Jetpack Navigation BottomNavigationView backstack error 처리 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] Jetpack Navigation BottomNavigationView backstack error 처리

막무가내막내 2020. 8. 11. 20:00
728x90

 

[2021-04-14 업데이트]

 

 

 

Jetpack Navigation 에서 제공하는 기능 중 하나인 BottomNavigationView 컴포넌트를 사용하고 있었습니다. 첫 화면이 BottomNavigationView 인 상태였는데 로그인 프래그먼트를 앞에 만들일이 생겼었습니다.

 

LoginFragment 가 이제 <navigaiton> 의 startDestination 이 되었는데 LoginFragment 의 백스택을 popUpTo 등으로 제거할려면 바텀네비게이션간의 이동도 스택으로 계속쌓이고 LoginFragment 백스택을 제거하지 않으면 좀 이상한 네비게이션 구조를 가지고 바텀네비에서 바텀네비간 이동한 후 백스택을 누르면 바텀네비 홈으로 가는데 LoginFragment 로 가는 이상한 현상들이 일어났습니다.

결론부터 말씀드리면, Jetpack Navigation 과 바텀네비게이션뷰를 엮을려면 네비게이션 그래프의 첫 startDestination 이 바텀네비의 프래그먼트어야만 잘 연동 또는 동작이 바르게 됩니다. 

뭔가 많이 나올듯한 흐름인데 아무리 구글링해도 찾을 수 없었고 구글 예제도 바텀네비부터 시작하는 플로우들 뿐이었습니다.

 

해결방법은 다음과 같습니다.

1. 먼저 startDestination 은 당연히 LoginFragment 로 해줍니다.

 

2. 보통 액티비티에서 처음에 네비게이션 host 프래그먼트를 findNavController 로 받아서 바텀네비게이션에 setUpWIthNavController() 를 해줄텐데 이것을 일단 보류합니다. (함수로 만들어만 놓습니다.)

 

3. 로그인프래그먼트에서 시작하고 action이 바텀네비프래그먼트로 되어있는 상태라고 가정하겠습니다. (LoginFragment -> BottonNav1Fragment) 

로그인 관련 로직을 처리하고 바텀네비프래그먼트로 action(이동) 하기전에 

 findNavController().graph.startDestination = R.id.바텀네비프래그먼트ID

를 통해 startDestination 을 바텀프래그먼트 ID로 바꿪고 2번에서 미뤄놨던 작업을 activity.함수() 로 바텀네비를 세팅을 해줍니다.

그러면 startDestination 도 직접 바꿔논 상태고 바텀네비의 세팅이 잘 될 것입니다.

 

 

 

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments