[문제 발생]
앞서 한 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()
}
[리뷰]
간단한 코드지만 항상 고민하고 검색하는데 엄청난 시간이 소모된다.
이것이 프로그래밍 하는것에 대한 어려움이며 이러한 간단한 코드들이 쌓이면서 내 개발 실력도 빠르게
발전할 수 있다고 믿으면서 계속 개발을 진행하고 있다.
해결 방안을 찾는 것이 가장 복잡하고 힘든 일이지만 , 그만큼 많은 공부를 할 수 있다.