📜 TIL

[Android] OnBackPressedCallback 사용하여 뒤로가기(Back Press) 구현하기

둥굴둥굴둥굴레차 2023. 2. 17. 13:20

구현하게된 계기

    • 회원가입 버튼 클릭 시 회원가입하는 창으로 이동하는 기능을 만들었다.
      • Fragment -> Fragment이동
    • 근데 휴대폰의 뒤로가기 버튼을 눌러 이전 Fragment로 되돌아 가려하면 회색 창이 나타난 뒤 그 다음 Fragment가 보인다..왜지? 또한 Logcat을 확인해보니 LoginFragment의 binding에서 NullPointerException이 발생

회색창과 앱이 죽은 이유

회색 창에 대해서는, 뒤로가기를 누르면 기존 JoinFragment만 종료되고 이 Fragment의 container역할을 한 JoinActivity(회색창)는 억지로(?) 종료되었기 때문에 아주 잠깐 보였다가 없어지는 것 같다

 

또한, LauncherActivity(최상단 view)가 화면에 보여지는 상태서 뒤로가기를 눌러 바탕화면이 보일 때도 Logcat에서는 NullPointerException이 발생하고 있었다!

 

 

💡 백 버튼(back press)을 눌렀을 때에 대한 설정/코딩을 따로 해주어야 하는구나!

 

Fragment에서 뒤로가기 버튼(Back Press) 처리하여 attach된 Activity 종료하기

→ Android Document에는 아래와 같이 사용하라는 예시가 나와있다!

 

이를 참고하여 만들어보았다.

 

class JoinFragment : Fragment() {
    private var _binding: FragmentJoinBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentJoinBinding.inflate(inflater, container, false)

        return binding.root
}

    override fun onAttach(context: Context) {
        super.onAttach(context)

        val callback: OnBackPressedCallback = object: OnBackPressedCallback(true){
            override fun handleOnBackPressed() {
activity!!.finish()
            }
        }
        requireActivity().onBackPressedDispatcher.addCallback(this, callback)

    }

}
  • activity?.finish() : 현재 Fragment인 JoinFragment와 associated된 Activity인 JoinActivity를 close해주기 위해 사용
  • addCallback(this, backPressedCallback) : Fragment 내에선 자기자신을 this로 불러올 수 없다. 그런데 여기서 this로 JoinFragment를 불러올 수 있는 이유는 onAttach를 사용해 JoinFragment가 JoinActivity와 attach되어있기 때문이다.
    • 만약 onAttach를 사용하지 않는다면 viewLifecycleOwner를 this대신 넣어줘야 한다.

 

JoinFragment에 위와 같이 설정 후 LoginFragment에도 똑같은 로직을 사용하여 Back Press동작에 대해 완벽히 대비하였다. 이제 뒤로가기 버튼을 통해 회원가입 화면에서 로그인 화면으로 되돌아 갈 때도, 로그인 화면에서 바탕화면으로 넘어갈 때도 Exception이 발생하지 않는다!

 


 

참고로 Back Press에 대한 처리는 보통 이렇게 처리해왔었다. 그러나 아래와 같은 이유로 나는 위와 같이 OnBackPressedDispatcher()를 사용했다

 

출처: https://readystory.tistory.com/186

 

[Android] Fragment에서 Back Press 처리하기(with. OnBackPressedDispatcher)

Android App을 개발하다 보면 화면을 구성할 때 하나의 액티비티에 다수의 프래그먼트를 사용해서 구성하는 경우가 많습니다. 그러나 안드로이드의 Fragment에는 Activity의 onBackPressed()와 같은 콜백 메

readystory.tistory.com

 


 

제 글이 당신에게 도움이 되었길 바랍니다.

추가적인 질문은 언제든지 환영해요.

 

인상깊게 보셨다면 광고 하나만 클릭해주세요! 정말 큰 힘이 됩니다~! 🤠