백버튼 클릭 시 Fragment의 잔상이 남는 오류와 해결방법

순순·2024년 4월 20일

Android

목록 보기
8/12

요즘 앱들을 보면, 백버튼을 두 번 누를 경우 어플을 종료하는 기능이 있다. (실수로 한 번 눌렀을 때 말고 빠르게 두 번 눌렀을 때만 종료되도록)

그래서 이 기능을 구현해봤는데... 프래그먼트를 제거한 후에도 화면에 잔상이 남는 오류가 발생했다.

문제의 원인과 해결 방법에 대해 열심히 찾아봤다.

문제 상황

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

profile
플러터와 안드로이드를 공부합니다

0개의 댓글