Activity에서 Back 버튼이 눌렸을 때의 이벤트를 구현할 때는 onBackPressed() 함수를 재정의하는것으로 간단하게 구현할 수 있다.
하지만 한 Activity에 여러 Fragment를 사용하게 되면서 각 Fragment별로 Back 버튼 이벤트를 정의할 수 있다면 편할것이라 생각해 방법을 찾아보았다.
또한 이 방법은 onBackPressed() 함수가 Duplicated 되었기 때문에 Activity에서도 이 방법을 사용하는 편이 좋아 보인다.
액티비티의 getOnBackPressedDispatcher()의 addCallback(LifecycleOwner, onBackPressedCallback)
메소드를 사용해 이벤트를 구현할 수 있다.
LifecycleOwner는 callback 메소드가 따라갈 owner의 Lifecycle 를 지정해준다.
즉 넣어줄 callback 메소드가 어느 화면에서 적용될 지 설정한다.
이벤트를 정의해줄 액티비티나 프래그먼트 자신을 넣어주면 된다.
onBackPressedCallback에 Back 버튼이 눌렸을 때 발생할 callback 메소드를 넣어준다.
사용 예시는 다음과 같다.
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
}
프래그먼트에서 사용하는 예이기 때문에 requireActivity()로 부모 Activity를 받아와 사용하였다.
onBackPressedCallback 메소드는 다음처럼 정의할 수 있다.
private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
...
}
};
handleOnBackPressed() 메소드 안에 Back 버튼이 눌렸을 때 작동할 코드를 작성해주면 된다.