기본적으로 뒤로가기 이벤트는 Activity에 발생한다.
Fragment가 뒤로가기 이벤트를 받기위해서는 이 이벤트를 가로채기위해 콜백 함수를 등록해줘야한다.
class MyFragment:Fragment(){
lateinit var callback: OnBackPressedCallback
...
override fun onAttach(context: Context) {
super.onAttach(context)
setBackEvent()
}
private fun setBackEvent(){
callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//Fragment에서 Back했을 때 실행할 코드
callback.remove() //fragment에 back잡히는 것 해제
}
}
//뒤로가기 콜백 등록 코드. Fragment에 back 잡히도록 하기
requireActivity().onBackPressedDispatcher.addCallback(
this,
callback
)
}
...
}
Activity에서 발생하는 back 이벤트의 기능을 재정의하고 싶을 경우
class MainActivity:AppCompatActivity(){
...
private val backcallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//사용자 정의 back 이벤트
systemBackEvent()
}
}
private fun systemBackEvent(){
//callback을 해지.
backcallback.remove()
// 시스템자체 back 실행. (위코드처럼 해지하지 않았을 경우에는 사용자정의 callback이 호출됨)
this.onBackPressedDispatcher.onBackPressed()
}
override fun onStart() {
super.onStart()
//callback을 onStart에 등록해줘야됨.
//시스템 뒤로가기를 사용했을 때, callback이 해지상태로 어플이 onPause되어있는데
//다시 어플을 띄우면 onCreate를 거치지 않고 바로 onStart되기 때문에
//callback이 등록되지 않아서 majorFragment 에서 시스템 뒤로가기를하면 어플이 닫혀버림
this.onBackPressedDispatcher.addCallback(this, backcallback)
}
...
}