본문 바로가기
Android/Activity

Activity 또는 Fragment에서 뒤로가기, 홈 버튼 이벤트 만들기

by 굿햄 2022. 10. 25.

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)
    }

 

댓글