Android Fragment 뒤로가기 처리 (백키처리) onBackPressedDispatcher
개요
Android 앱에서 뒤로가기 버튼은 중요한 내비게이션 요소입니다.
특히 Fragment에서는 뒤로가기 동작을 사용자 정의하거나 특정 작업을 수행해야 할 때가 많습니다. 이 글에서는 Android의 onBackPressedDispatcher를 사용하여 Fragment에서 뒤로가기 동작을 처리하는 방법을 자세히 설명합니다.
1. onBackPressedDispatcher란?
onBackPressedDispatcher는 Android의 뒤로가기 이벤트를 관리하는 API입니다.
- AndroidX에서 제공하는 Jetpack 컴포넌트로, Activity 및 Fragment의 뒤로가기 이벤트를 처리합니다.
- 개발자는 뒤로가기 버튼을 눌렀을 때 발생하는 기본 동작을 차단하거나 변경할 수 있습니다.
- Fragment에서는 이 API를 통해 뒤로가기 이벤트를 독립적으로 처리할 수 있습니다.
2. 기본 사용법: Fragment 에서 뒤로가기 이벤트 처리
Fragment에서 뒤로가기 이벤트를 처리하려면 requireActivity().onBackPressedDispatcher를 사용해야 합니다.
2.1 개념
- 정의: onBackPressedDispatcher에 연결할 뒤로가기 이벤트 콜백을 정의합니다.
- 생성자:
- OnBackPressedCallback(enabled: Boolean)
- enabled가 true이면 콜백이 활성화됩니다.
- 기타:
- isEnabled true/false 설정 가능
callback.isEnabled = false // 비활성화
callback.isEnabled = true // 활성화
2.2 뒤로가기 예제의 코드 설명을 간결하게 재구성
class DoubleBackExitFragment : Fragment() {
private var lastBackPressedTime: Long = 0 // 마지막 뒤로가기 누른 시간
private lateinit var callback: OnBackPressedCallback
private var isConditionMet = false // 조건을 만족하는지 여부
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 뒤로가기 콜백 정의
callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (isConditionMet) {
// 조건이 만족되면 콜백 비활성화 후 기본 뒤로가기 동작
isEnabled = false
requireActivity().onBackPressed() // 기본 뒤로가기 호출
} else {
// 두 번 눌러야 종료되는 로직
val currentTime = System.currentTimeMillis()
if (currentTime - lastBackPressedTime < 2000) {
requireActivity().finish() // 앱 종료
} else {
lastBackPressedTime = currentTime
Toast.makeText(requireContext(), "한 번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT).show()
}
}
}
}
// 콜백 추가
requireActivity().onBackPressedDispatcher.addCallback(this, callback)
}
// 특정 조건에 따라 콜백 활성화/비활성화 변경
fun setConditionMet(isMet: Boolean) {
isConditionMet = isMet
callback.isEnabled = !isMet // 조건이 만족되면 콜백을 비활성화
}
}
코드 설명
- isConditionMet 변수
- 특정 조건이 만족되었는지 여부를 저장합니다.
- true로 설정되면, 뒤로가기 콜백이 비활성화됩니다.
- 콜백 비활성화 로직
- isConditionMet가 true일 경우 isEnabled = false를 설정해 콜백을 비활성화합니다.
- 이후, requireActivity().onBackPressed()를 호출해 기본 뒤로가기 동작을 실행합니다.
- setConditionMet 메서드:
- 외부에서 조건을 변경할 수 있도록 메서드를 제공합니다.
- 조건에 따라 callback.isEnabled를 활성화하거나 비활성화합니다.
4. 결론
onBackPressedDispatcher는 Fragment에서 뒤로가기 동작을 세밀하게 제어할 수 있는 강력한 도구입니다.
- 유연성: 사용자 정의 동작을 쉽게 추가하거나 기본 동작을 차단할 수 있습니다.
- 조건부 처리: 콜백의 활성화/비활성화를 동적으로 관리하여 다양한 시나리오에 대응할 수 있습니다.
- 재사용성: setConditionMet와 같은 메서드를 활용해 조건에 따라 동작을 제어할 수 있습니다.