티스토리 뷰
[안드로이드/코틀린] onBackPressed() deprecated 대체 방법, OnBackPressedCallback 알아보기
hrniin 2023. 9. 23. 14:57
API 33 이후부터 onBackPressed()가 deprecated 되었다.
onBackPressed()는 사용자가 뒤로가기 버튼을 누를 때 호출되는 함수로,
주로 뒤로가기 버튼으로 액티비티/앱을 빠져나가는 것을 막을 때 사용했다.
이 함수를 대체할 수 있는 onBackPressedCallback을 알아보려고 한다.
onBackPressedCallback은 뒤로가기 버튼이 눌렸을 때 호출되는 콜백이다.
이 콜백을 onBackPressedDispatcher에 추가하면, 버튼이 눌릴 때마다 지정해준 onBackPressedCallback이 호출된다.
1. onBackPressedCallback 생성
뒤로 가기 버튼이 눌렸을 때 어떤 작업을 수행할지 작성
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (System.currentTimeMillis() - backPressedTime >= 2000) {
backPressedTime = System.currentTimeMillis()
showToast(context, "뒤로 버튼을 한번 더 누르면 앱을 종료합니다.")
} else if (System.currentTimeMillis() - backPressedTime < 2000) {
finish()
}
}
}
Callback의 첫 번째 생성자로 boolean 값이 들어가는데, 이는 콜백 활성화를 나타내는 enable 값이다.
즉, enable이 true인 경우에만 디스패처가 콜백을 호출한다.
setEnabled()를 호출해서 enable 값을 변경할 수 있다.
2. onBackPressedDispatcher에 생성한 콜백 추가
this.onBackPressedDispatcher.addCallback(this, callback)
addCallback을 통해 여러개의 콜백을 추가할 수 있다.
이 경우 추가된 순서의 역순으로 호출된다. 예를 들어 1, 2, 3 순서로 추가했다면 3, 2, 1 순서로 호출된다.
전체 코드
private fun addOnBackPressedCallback() {
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// 뒤로 가기 버튼이 눌렸을 때 처리 동작
}
}
this.onBackPressedDispatcher.addCallback(this, callback)
}
나는 callback을 생성하고 디스패처에 추가하는 코드를 하나의 함수로 묶어서, 이 함수를 onCreate()에서 호출했다.
뒤로 가기 버튼 막기
////////// 기존 코드
override fun onBackPressed() { }
////////// 대체된 코드
private fun addOnBackPressedCallback() {
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { }
}
this.onBackPressedDispatcher.addCallback(this, callback)
}
만약에 뒤로 가기 버튼으로 액티비티를 빠져나오는 것을 막고 싶다면,
콜백을 활성화(enable=true)로 하고 그 안에 아무런 내용도 적지 않으면 된다.
이때 디스패처에도 아무런 동작을 하지 않는 콜백만이 등록되어 있어야 한다.
참고
https://developer.android.com/guide/navigation/navigation-custom-back?hl=ko
'app > android' 카테고리의 다른 글
[안드로이드/코틀린] PendingIntent 개념 알아보기 (0) | 2023.09.25 |
---|---|
[안드로이드/코틀린] fragment에서 context, activity를 얻는 방법 (0) | 2023.09.23 |
[안드로이드/코틀린] Activity와 Fragment 간 데이터 전달하기 (0) | 2023.09.21 |
[안드로이드/코틀린] 커스텀 다이얼로그 구현 방법 두 가지 (0) | 2023.09.21 |
[안드로이드/코틀린] 데이터 바인딩 (DataBinding) (0) | 2023.09.21 |