구현하게된 계기
- 회원가입 버튼 클릭 시 회원가입하는 창으로 이동하는 기능을 만들었다.
- 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
제 글이 당신에게 도움이 되었길 바랍니다.
추가적인 질문은 언제든지 환영해요.
인상깊게 보셨다면 광고 하나만 클릭해주세요! 정말 큰 힘이 됩니다~! 🤠
'📜 TIL' 카테고리의 다른 글
[Android] Retrofit활용해 서버와 통신 및 okHttp로 로그찍어보기 (0) | 2023.02.20 |
---|---|
[Android] 화면 이동하자마자 키보드가 생기며 입력창에 포커스 맞추는 기능 구현 (0) | 2023.02.19 |
[Android] 로그인 시 아이디 패스워드 유효성 검사하는 로직 만들기 (1) | 2023.02.15 |
[Android] 패스워드 아이콘이 글자가 존재할 때만 보이도록 만들기 (0) | 2023.02.13 |
[Android] 로그인창 아이디에 적힌 글자 한번에 지우는 기능 구현하기 (0) | 2023.02.11 |