문제상황
액티비티는 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
반응형
'Android' 카테고리의 다른 글
[안드로이드] 코틀린에서 object의 정의와 사용 (0) | 2023.02.27 |
---|---|
[안드로이드] "token null is not valid; is your activity running?" 오류 해결방법 (1) | 2023.02.15 |
[안드로이드] ScrollView 안에 RecyclerView 구현 시 RecyclerView의 스크롤 막는 방법 (1) | 2023.02.06 |
[안드로이드] 프로젝트를 Git에 Push할 때 원하는 정보 숨기는 방법(.gitIgnore) (0) | 2023.02.03 |
[안드로이드] 회원가입 과정에서 EditText 텍스트 변경상태 감지해서 버튼 활성화하기 (0) | 2023.02.02 |