Android Fragment에서의 BackPress 동작 제어

tom·2022년 2월 7일
1

Android

목록 보기
6/6
post-thumbnail

🌱 발단

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 과 관련하여 조금 더 공부를 한 뒤에 다시 보면 좋을 것 같다는 생각이 들었습니다.

profile
🌱 주니어 안드로이드 개발자 최우영입니다.

0개의 댓글