[Android] Fragment 에서의 BackPress 동작 제어
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 이 호출될 때 오류가 발생할 수 있을 것이다.
하지만 친절한 Android 는 addCallback 함수를 오버로딩 하여 등록하려는 Callback 에 owner 를 정해주어 해당 owner 의 Lifecycle 을 따라갈 수 있도록 해놓았다.
그럼 현재 Fragment 에서만 동작하게 하려면, 현재 Fragment 를 owner parameter 로 넣어주면 된다.
requireActivity().onBackPressedDispatcher
.addCallback(this, onBackPressedCallback)
사실 아주 간단한 코드이지만, 어떻게 동작하는 지에 대해서 좀 더 알아보고 싶어서 ComponentActivity 까지만 일단 다녀왔다. Lifecycle 에 대해서 조금 더 공부를 한 뒤에 다시 보면 좋을 듯 하다.
이 글에 오류가 있거나 다른 좋은 방법이 있다면, 메일이나 댓글로 채찍질 해주시면 감사하겠습니다.ㅎㅎ