요즘 앱들을 보면, 백버튼을 두 번 누를 경우 어플을 종료하는 기능이 있다. (실수로 한 번 눌렀을 때 말고 빠르게 두 번 눌렀을 때만 종료되도록)
그래서 이 기능을 구현해봤는데... 프래그먼트를 제거한 후에도 화면에 잔상이 남는 오류가 발생했다.
문제의 원인과 해결 방법에 대해 열심히 찾아봤다.
Fragment를 remove() 했음에도 불구하고 프래그먼트의 잔상이 남아있어 어플이 정상적으로 종료되지 않는 경우가 발생.
// Back Button 눌렀을 때
fun settingBackButton(){
mainActivity.onBackPressedDispatcher.addCallback {
// 뒤로가기 처리 메서드 호출
backProcess()
// 뒤로가기 버튼의 콜백 제거
remove()
}
}
여기에서, 콜백을 제거하는 것은 백버튼이 연속해서 두 번 눌리지 않도록 하여 어플이 실수로 꺼지지 않게 하는 역할을 한다. 그러나 프래그먼트를 제거할 때 잔상이 남는 문제는 주로 remove()가 프래그먼트를 완전히 정리하지 못했거나, FragmentTransaction이 완료되지 않아서 발생할 수 있다.
(1) 콜백 제거 시점 문제
서치해보니 백버튼의 콜백이 제거되면서 백스택이 비정상적으로 종료되거나, 완전히 사라지지 않아서 프래그먼트의 UI가 남는 경우도 있다고 한다.
다행히 예상한 원인이 맞았다. 백스택을 비워주니 해결되었다.
잊지말자... 프래그먼트를 제거할 때 백스택을 사용했다면, popBackStack()을 통해 백스택을 비워줘야 한다.
// Back Button 눌렀을 때
fun settingBackButton(){
mainActivity.onBackPressedDispatcher.addCallback {
// 뒤로가기 처리 메서드 호출
backProcess()
// 백스택 비우기
supportFragmentManager.popBackStackImmediate()
// 뒤로가기 버튼의 콜백 제거
remove()
}
}
참고한 블로그
https://jinudmjournal.tistory.com/3
https://develop-oj.tistory.com/43