250x250
06-26 10:56
관리 메뉴

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

[안드로이드] Jetpack Navigation 사용시 프래그먼트 재생성 되는 문제 해결 (android bottom navigation fragment save state) 본문

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

[안드로이드] Jetpack Navigation 사용시 프래그먼트 재생성 되는 문제 해결 (android bottom navigation fragment save state)

막무가내막내 2021. 12. 4. 23:05
300x250
SMALL

 

 

 

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

 

GitHub - STAR-ZERO/navigation-keep-fragment-sample

Contribute to STAR-ZERO/navigation-keep-fragment-sample development by creating an account on GitHub.

github.com

위 깃허브 샘플프로젝트의 예제 화면

안드로이드 Jetpack Navigation 사용을 하면 프래그먼트는 항상 재생성이 됩니다.

그래서 Jetpack의 BottomNavigation을 사용해 밑에 탭이 있는 메인 홈화면을 구성한다면,

홈탭을 누를때마다 프래그먼트가 재생성이 되서 로딩도 느리고 뭔가 시중앱과 다르게 부자연스러워 보이기도 할겁니다.  예를들어 대표적인 시중앱인 카카오톡, 토스 등은 메인 홈화면의 바텀 탭을 누르면 처음에만 화면이 생성되고 그 다음 다시 누를떄는 재생성되지 않고 기존화면(프래그먼트)를 보여주어 빠릅니다.

 

즉, 홈화면의 바텀탭간의 화면전환(프래그먼트) 만큼은 재생성이 되는 것을 막는게 좋아보였습니다.

 

이 샘플 프로젝트에서 Jetpack Navigationd을 커스텀해서 이러한 문제점을 해결하였는데 이 코드를 살짝 수정하여 저도 문제를 해결할 수 있었습니다.

 

현재 좀 할게 많은 상태기도하고 이를 구현한 깃허브 레포지토리만 남겨놓겠습니다.

https://github.com/mtjin/bungsegwon-android

 

GitHub - mtjin/bungsegwon-android

Contribute to mtjin/bungsegwon-android development by creating an account on GitHub.

github.com

 

 

저와 같은 문제를 겪은 분들은 샘플 프로젝트를 보면 해결하실 수 있을 것 같습니다.

 

 

 

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

 

 

300x250
LIST
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
8 Comments
  • 프로필사진 안녕하세요 2022.03.17 09:57 현재 좀 할게 많은 상태기도하고 깃허브 레포지토리가 Private 이라 코드는 안올리겠습니다. (나중에 시간이 나면 원리와 함꼐 올려볼까합니다.)
    -> 언제하시나요 보고싶어요
  • 프로필사진 Favicon of https://youngest-programming.tistory.com BlogIcon 막무가내막내 2022.03.17 23:27 신고 안녕하세요 ㅎㅎ
    직장을 다녀서 답변이 늦었네요 ㅠ

    https://github.com/mtjin/malhaebishigae-room-reservation-app-userversion
    프로젝트를 참고하시거나

    새로운 방법은
    https://youngest-programming.tistory.com/651?category=898095
    를 참고하시면 될 것 같습니다!

    감사합니다 :)
  • 프로필사진 이지훈 2022.05.12 11:29 안녕하세요 막무가내막내님 항상 글 잘보고 있습니다 ㅎ
    다름이 아니라 샘플 프로젝트가 navigation을 구현하는 구버전의 방식이라 (fragment -> fragmentContainerView) 그 부분만 바꾸고 간단하게 프로젝트를 만들어 보았는데 startDestination에 해당하는 프래그먼트만 hide & show 되고 나머지 bottomNavigation과 연결되어있는 프래그먼트들은 replace(이동할때마다 새로만들어져 onCreate 로그가 찍힘)가 되는데 혹시 어디가 문제일까요...?

    https://github.com/easyhooon/ShowHideNavigation 물어볼 곳이 없어 질문 남깁니다 ㅠㅠ

    위 덧글에 새로운 방법을 참고해보려구했는데 이글과 같은글이네요
  • 프로필사진 Favicon of https://youngest-programming.tistory.com BlogIcon 막무가내막내 2022.05.12 12:25 신고 안녕하세요 :)
    애초에 jetpack navigation에서 바텀네비게이션과 프래그먼트조합이 재생성되게 만들어져있어서 이 포스팅의 방법대로 커스텀해서 사용할수밖에없고 새로운방법은 제 레포지토라에가서 bungsegwon 레포를 보시면 될 것 같습니다!
  • 프로필사진 BlogIcon 이지훈 2022.05.12 13:49 답변 감사합니다 ㅜ 해당 프로젝트 클론해서 실행해보려고 하는데 databinding 관련한 에러가 뜨네요 ㅜ 구현방법 참고해서 수정해보겠습니다!
  • 프로필사진 이지훈 2022.05.20 15:25 막내님 안녕하세요 ㅎ 다름이 아니라 제가 navigation latest version인 2.4.2에서 올려주신 샘플코드를 실행시켜보았는데 onCreate가 메뉴이동시마다 호출이되더라구요 (정확히는 2.3.5 version 까지는 onCreate 호출이 처음 생성때만 일어나고 2.4.0 alpha01 version 부터는 계속 호출됩니다)
    구글이 막아놓은건지 패치로 인해 코드가 제대로 동작을 안하는것인지
    근데 또 희한하게 startdestination으로 설정한 fragment에 경우는 재호출이 일어나지 않고(기존의 로직 유지), 뿐만 아니라 재생성된 fragment의 recyclerview의 스크롤 (posion)이 유지가 되더라구요 어떻게 그럴수가 있는것인지 재생성이 되면 adapter가 다시 recyclerview에 장착이 될텐데 신기하더라구요 덧글 남깁니다!
  • 프로필사진 Favicon of https://blothhundr.tistory.com BlogIcon 장복자 2022.06.16 12:20 신고 startDestinationFragment 는 원래 파괴되지 않습니다. 스택에 들어있고, 재호출하면 그냥 pop() 됩니다
  • 프로필사진 Favicon of https://youngest-programming.tistory.com BlogIcon 막무가내막내 2022.06.16 12:36 신고 답변 감사합니다ㅏ :)
댓글쓰기 폼