custom navigator 를 이용한 Hide&Show 방식의 Navigation 구현

이지훈·2022년 5월 20일
0

기본적으로 jetpack navigation은 replace 방식으로 fragment을 띄운다
바텀 메뉴 클릭하면 fragment 생성되고 onCreated이호출된 후 일련의 과정 끝에 다른 바텀 메뉴가 클릭되면 onDestoryView가 호출되어 해당 프래그먼트는 remove 된다

바텀 메뉴를 선택할때마다 fragment가 재생성이 되면 data들을 Room과 같은 db에 cache 하지 않는 이상 재호출이 되므로 거의 같은 정보를 계속 처음부터 받아와 로딩화면이 반복되어 사용자에게 보여지는 등의 문제가 발생할 수 있다

이러한 문제를 위에 글들의 도움을 통해 해결할 수 있었다.

**하지만 한가지 문제점이 있다.

navigation의 빌드 버전을 최신버전(2.4.2)으로 설정할 경우 위에 방법들을 통해 custom navigatior를 구현해도 fragment가 계속 재호출 된다. (onCreate의 로그를 찍어보면 재호출됨을 확인할 수 있다)**

버전을 downgrade 하며 빌드해본 결과 2.3.5 버전까지 위의 방법이 적용되며 2.4.0 alpha01 버전 부터 적용되지 않음을 확인할 수 있었다.

위의 샘플코드와 블로그 글을 읽고 구현한 샘플코드

https://github.com/easyhooon/ShowHideNavigation

하지만 아직 두가지 궁금증이 풀리지 않았다.

  1. 최신 버전으로 빌드할 경우 startDestination으로 지정한 fragment는 재생성되지 않고 show&hide 방식이 적용된다 startDestination fragment 만!

  2. 최신 버전으로 빌드할 경우 재생성 되었을 fragment의 recyclerview의 포지션이 유지된다.
    스크롤을 내려 포지션을 중간 위치쯤에 위치해두면 그 위치를 유지한다. 재생성되면 oncreate 부터 모든 생명주기를 타게 되어 onViewCreated 에서 adapter가 재부착이 될텐데 어떻게 포지션을 유지하는 것인지 잘 모르겠다.

위의 두가지 이슈를 추후에 확인해보도록 하겠다.

참고한 블로그와 깃허브 레포

https://hungseong.tistory.com/56

https://youngest-programming.tistory.com/651?category=898095

https://github.com/STAR-ZERO/navigation-keep-fragment-sample

https://github.com/HunSeongPark/BookBak

profile
실력은 고통의 총합이다. Android Developer

0개의 댓글