fragment onBackPressedDispatcher

김토끼·2021년 9월 28일
1

fragment에서 onBackPressed 이벤트를 받아오기 위해 사용

in Fragment:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity?.onBackPressedDispatcher?.addCallback(object :OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                // onBackPressed() 호출시 동작
            }
        })
    }

...인데 가끔 잘 동작을 안한다

삽질하다보니 activity에서 onBackPressed를 오버라이딩 하면 저 dispatcher가 동작을 안하는 문제가 있음

거기다 fragment 열어둔 채로 다른 화면 (퍼미션 체크라던가) 갔다오면 아래처럼 정상적으로 동작하지 않는 문제 발생

Fragment [Fragment name] not associated with a fragment manager.

onBackPressedDispatcher에 owner 추가해주고
activity에서 onBackPressed() 함수에 onBackPressedDispatcher.hasEnabledCallbacks() 조건으로 체크하니까 해결됐다

in fragment:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
       // calback에 owner(this) 추가
       activity?.onBackPressedDispatcher?.addCallback(this, object :OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                // onBackPressed() 호출시 동작
            }
        })
    }

in Activity:

override fun onBackPressed() {
        if (onBackPressedDispatcher.hasEnabledCallbacks()) {
            onBackPressedDispatcher.onBackPressed()
            return
        }
        // else case
        super.onBackPressed()
}
profile
방구석 김토끼🐰

0개의 댓글

Powered by GraphCDN, the GraphQL CDN