문제
BottomNavigation과 5개의 fragment로 메인을 구성하였는데 탭을 이동하거나 back버튼을 눌렀을 때 문제가 생겼다.
fragment를 전환 할 때마다 화면이 지워지고 다시 생성되는데 앱이 느려지는 문제 뿐만이 아니라, 매번 화면 재생성을 하느라 메모리도 많이 먹고 기존에 하던 작업이나 스크롤 위치가 다 날라갔다..
원인
화면 재생성을 막으려고 온갖 조건문을 걸고 onCreateView에 있던 순서도 바꿔봤는데 소용이 없었다.
겨우 원인을 찾았는데, 원인은 fragment끼리 이동할 때 서로 visible, invisible 되는 줄알았는데, 이동하면 이전 모든 fragment는 destroy되고 새로운 fragment만 남아서 애초에 삭제된 fragment를 유지하려고 뻘짓을 했던 것이었다.
원인이 되는 부분은 MainActivity에서 FragmentTransaction의 replace 메서드를 쓰면 이전의 모든 fragment를 삭제하고
새로운 fragment를 가져온다.
replace() vs add()
replace : 기존의 모든 fragment를 삭제 후 새로운 것으로 교체
add : 기존의 것을 유지 새로운 것을 겹침
add 채택
add를 쓰면 기존에 있던 fragment가 남고 겹쳐지게 되는데, hide, show메서드를 써서 안보이게 하는 방식을 채택했다.
그러면 앱 실행 시 모든 fragment가 실행되고 홈화면만 show를 해주고 탭을 이동할 때마다 show, hide를 바꿔주는 방식으로 구현하니 매번 fragment를 삭제하고 생성하지 않아서 하던 작업도 유지되고 전보다 빠르고 메모리도 덜먹게 되었다. addBackStack(null)을 추가해도 뒤로가기가 잘 적용이 된다
다른 문제 발생
하지만 원래의 코드에 replace를 add로 바꾸니 에러가 발생하고, 샘플 코드에 back버튼을 누르니, fragment는 잘 작동하는데 bottom메뉴들이 안따라오는 문제가 생겨서 다음 포스트에 다시 해결하는걸 작성해야한다..
댓글