본문 바로가기
Android

[안드로이드] 액티비티 + 다수의 프래그먼트 상황에서 뒤로가기, 뒤로가기 두 번 클릭 처리하기

by JongSeok 2023. 2. 12.

문제상황

액티비티는 MainActivity 하나와 액티비티 위에 다수의 프래그먼트를 add 하는 방식으로 앱을 개발하고 있었습니다.

 

프래그먼트에서는 OnBackPressedCallback을 통해 뒤로가기를 처리하고 이제 MainActivity에서는 뒤로가기를 두 번 클릭 시 앱을 종료되게끔 구현하기 위해 MainActivity에서 onBackPressed()를 override했습니다.

 

그런데 onBackPressed를 재정의하니 앞서 잘 작동하던 프래그먼트에서 뒤로가기가 MainActivity의 onBackPressed()에서 모두 실행되기 시작했습니다.

 

즉, 프래그먼트 화면이 여러 번 쌓이더라도 뒤로가기 클릭 시 바로 MainActivity의 onBackPressed()가 실행되기 때문에 앱이 종료되는 상황이었습니다.


해결방법

뒤로가기가 MainActivity의 onBackPressed()에서 처리되기 때문에 onBackPressed에서 현재 해당 액티비티 위에 프래그먼트가 쌓여있는지 확인하고 뒤로가기를 처리하는 방식을 구현했습니다.

MainActivity

var mBackWait:Long = 0
override fun onBackPressed() {
    var fgList = supportFragmentManager.fragments

    if (fgList.isEmpty()) {
        // 쌓여있는 프래그먼트가 없다면
        if(System.currentTimeMillis() - mBackWait >=2000 ) {
            mBackWait = System.currentTimeMillis()
            Toast.makeText(applicationContext,"뒤로가기 버튼을 한번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT).show()
        } else {
            finish()
        }
    } else {
        // 쌓여있는 프래그먼트가 있다면 최상위 프래그먼트에서 뒤로가기 처리
        fgList.last().requireActivity().supportFragmentManager.beginTransaction()
            .setCustomAnimations(0, R.anim.horizon_exit_front)
            .remove(fgList.last()).commit()
    }
}

 

Fragment에서 뒤로가기를 처리한 방법은 이전 포스팅을 참고해 주세요 :)

 

[안드로이드] Fragment에서 뒤로가기 처리하기 - onBackPressedDispatcher

안드로이드 앱을 개발하다 보면 하나의 액티비티와 다수의 프래그먼트의 구성으로 개발하는 경우가 있습니다. 액티비티로만 구성된 화면의 경우 액티비티 위에 다른 액티비티가 쌓이는 방식이

develop-oj.tistory.com

 

728x90
반응형