티스토리 뷰

728x90

 

 

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 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함