[Kotlin, Android] Fragment에서 뒤로가기 시 문제 , Activity 종료 문제

[문제 발생]

 

앞서 한 Activity에서 Fragment 간 전환에 대해서 문제를 해결 했었는데 다른 문제가 발생했다.

andorid에서 뒤로가기는 방법은 두가지가 있다.

1. 자체 제작한 뒤로가기 버튼 클릭 시 동작 이벤트 설정

2. 안드로이드 기기의 뒤로가기 버튼 클릭 시 화면 전환

앞에서는 1의 방법으로 fragment 간 화면 전환을 처리했다.

하지만 2의 방법으로 사용자가 fragment 간의 화면 전환을 시도한다면 Activity가 전환되게 된다.

현재 Fragment 들을 띄우는 Activity는 Main Activity 즉 최종 Activity이므로 뒤로가기 클릭 시 

앱이 종료되는 현상이 생긴다. 

Fragment에서 뒤로가기 클릭 시 Activity 전환이 아닌 Fragment를 전환하는 기능이 필요해졌다.

 

[해결 방안 ]

 

<step 1> 우선 뒤로가기 클릭 시 Fragment 간 전환하는 방법을 찾아봤다.

Fragment에는 Activity 처럼 내부 override function인 onBackPressed()를 지원하지 않는다 .

하지만 다행이도 Fragment에서 BackPress 동작을 제어하기 위한 방안이 있었다.

 

private lateinit var callback: OnBackPressedCallback

 

위가 해결 방안이다  callback 함수를 구현해서 back 버튼 클릭 시 동작을 구현해주는 방안을 사용한다.

단순히 기능만 구현하는게 아니라 변수로 선언한 이유는 해당 Fragment가 종료 될 때 해당 기능 역시 

삭제 해주어야 하기 때문이다.

 

<step 2> 위에서 선언한 변수를 함수로 구현해야 한다.

우선 사용할 Fragment가 연관되어 있는 FragmentActivity를 호출해서 찾아줘야 한다.

requireActivity()를 호출해서 ComponentActivity의 메서드인 getOnBackPressedDispatcher를 사용해야 한다.

 

callback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        //뒤로가기 클릭 시 구현할 코드 
    }
}

 

이러한 구조가 되는데 

 

requireActivity().onBackPressedDispatcher.addCallback(this, callback)

 

이 코드를 반드시 추가해줘야 한다. 이 코드는 현재 Fragment에서만 동작하게 하려는 도움을 준다.

Lifycylce 관련해서 해당 callback을 따라가게 도와주는 코드인데 자세한건 좀 더 공부해 봐야겠다..

 

<step 3> 이제 뒤로가기 클릭 시 구현할 코드에 내가 만든 뒤로가기 함수를 구현해 준다 .

 

callback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        userActivity.onFragmentGoBack(this@FollowMainFragment)
    }
}
requireActivity().onBackPressedDispatcher.addCallback(this, callback)

 

최종 코드는 이러한 형태가 되었으며, userActivity는 이전에 fragment 전환  함수를 작성한 MainActivity 이다.

userActivity 중심으로 코드가 동작하며, 해당 Activity 중심으로 Fragment 화면이 전환된다.

 

<step 4> Fragment가 제거 될 때 Fragment 내부에서는 onDetach() 함수가 실행 된다. (Fragment 생명주기)

위에서 제작한 callback 함수를 제거 해주어야 한다.  

 

override fun onDetach() {
    super.onDetach()
    callback.remove()
}

 

[리뷰]

 

간단한 코드지만 항상 고민하고 검색하는데 엄청난 시간이 소모된다.

이것이 프로그래밍 하는것에 대한 어려움이며 이러한 간단한 코드들이 쌓이면서 내 개발 실력도 빠르게

발전할 수 있다고 믿으면서 계속 개발을 진행하고 있다.

해결 방안을 찾는 것이 가장 복잡하고 힘든 일이지만 , 그만큼 많은 공부를 할 수 있다.