Android Fragment에서는 Activity에 존재하는 override function 인 onBackPressed()
를 지원하지 않습니다.
따라서 Fragment에서 BackPress에 대한 동작을 제어하기 위해서는 OnBackPressedCallback
오브젝트를 Fragment가 속해있는 Activity에 등록해주어야 합니다.
이제 차례차례 어떻게 제어할 수 있는지에 대해서 알아보겠습니다.
먼저, 현재 Fragment가 속해있는 FragmentActivity를 requireActivity()
메소드를 호출하여 찾아야합니다. 해당 메소드는 Fragment클래스의 멤버 메소드이기 때문에, Fragment클래스를 상속받았다면 사용할 수 있습니다.
위의 requireActivity()
를 통해서 return 받은 FragmentActivity는 ComponentActivity를 상속하기 때문에 ComponentActivity의 멤버 메소드인 getOnBackPressedDispatcher()
메소드를 사용할 수 있게 됩니다.
<ComponentActivity.java 내부의 getOnBackPressedDispatcher 함수>
/**
* Retrieve the {@link OnBackPressedDispatcher} that will be triggered when
* {@link #onBackPressed()} is called.
* @return The {@link OnBackPressedDispatcher} associated with this ComponentActivity.
*/
@NonNull
@Override
public final OnBackPressedDispatcher getOnBackPressedDispatcher() {
return mOnBackPressedDispatcher;
}
해당 메소드 주석의 return 부분을 읽어보면, 해당 메소드는 현재 ComponentActivity와 연관되어있는 OnBackPressedDispatcher
오브젝트를 반환한다고 되어있습니다.
그렇다면 이렇게 가져온 OnBackPressedDispatcher
메소드를 어떻게 사용하는지 알아야합니다.
일단, OnBackPressedDispatcher
는 클래스입니다.
public final class OnBackPressedDispatcher {...}
그리고 Dispatcher, 말 그대로 무언가 관리하는 친구같습니다. 그럼 클래스 내부의 멤버 메소드중에 BackPress 이벤트에 대해서 관리하는 친구가 또 같이 있지 않을까 의구심을 가져볼만 합니다.
위 캡쳐된 사진에서 볼 수 있듯이, addCallback()
메소드가 발견됩니다. 이제 저 addCallback()
메소드를 지지고 볶아서 BackPress 이벤트가 발생했을 때 동작해야 할 코드를 작성하여 OnBackPressedCallback
오브젝트에 넣어주고 Callback 등록만하면 완성일 것 같습니다!
requireActivity().onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// 뒤로가기 눌렀을 때 동작할 코드
}
})
그런데, Fragment를 벗어나면 해당 Fragment에서만 동작할 수 있는 코드라고 한다면 등록된 Callback 이 호출될 때 Exception 이 발생할 수 있습니다.
여기서 또 친절한 Android 는 addCallback 함수를 오버로딩하여 등록하려는 Callback 에 owner 를 정해주어 해당 owner 의 lifecycle 을 따라갈 수 있도록 해놓았습니다.
그럼 다음과 같이 현재 Fragment에서만 동작하게 하고 싶다면, 현재 Fragment를 owner parameter 로 넣어주면 되겠습니다.
requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
사실 아주 간단한 코드이지만, 어떻게 동작하는지에 대해서 좀 더 알아보고 싶어 ComponentActivity까지만 일단 다녀왔습니다. lifecycle 과 관련하여 조금 더 공부를 한 뒤에 다시 보면 좋을 것 같다는 생각이 들었습니다.