Activity 또는 Fragment 단에서 툴바를 통해 Back Stack으로부터 화면을 다시 가져오거나, 다른 곳을 호출하는 등의 이벤트를 실행하기 위해선 두 개의 메소드 오버라이딩이 필요합니다.
- Activity 기준
- 툴바가 있을 경우
- onSupportNavigateUp 오버라이딩
- Back press 이벤트를 수신할 경우
- onBackPressed 오버라이딩
- 툴바가 있을 경우
아래 예시입니다.
Toolbar에 있는 NavigateUp 버튼과, 뒤로가기 Back Press 이벤트를 함께 처리하기 위해
onSupportNavigateUp 이벤트는 onBackPressed로 위임하는 패턴을 사용하고 있습니다.
override fun onSupportNavigateUp(): Boolean {
onBackPressed()
return true
}
override fun onBackPressed() {
val backStackCount = navController.backQueue.count { entry ->
entry.destination !is NavGraph
}
if (backStackCount == 1) { // When in start destination
if (isTaskRoot) {
MainActivity2.goHomeActivity()
}
finish()
} else {
super.onBackPressed()
}
}
그런데 위와 같이 선언하였음에도 동작을 하지 않는 경우가 두 가지가 있습니다.
하나는 OnCreate 또는 그 외에서 SupportActionBar 설정을 정상적으로 주지 않은 경우
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
나머지는 onOptionsItemSelected가 오버라이딩 된 경우입니다.
// 아래 구문이 들어갔을 경우 동작하지 않는다.
override fun onOptionsItemSelected(item: MenuItem): Boolean
위 두가지만 유의하시면 정상동작하는 것을 확인할 수 있습니다.
Fragment는 Activity에 콜백을 전달해줄 수 있으며,
툴바가 있는 경우 위와 같이 onSupportNavigateUp 에서 onBackPressed()를 호출하도록 해야합니다.
- Fragment 기준
- Back press 이벤트를 수신할 경우
private fun attachBackPressedCallback() {
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
val activityIntent = Intent(context, MainActivity::class.java)
scrapAdsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(activityIntent)
requireActivity().finish()
}
}
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
}
댓글