-
팀플 금연테스트 화면 - ViewPager2Android 2024. 5. 31. 21:30
ViewPager2 관련 시연 영상 해당 화면을 구현하면서 겪은 트러블 슈팅이 있다.
로그캣 오류
java.lang.NullPointerException
원인 코드 및 이유
// QuestionFragment ViewPagerFragment.moveToNextQuestionPage() // ViewPagerFragment private var _binding: FragmentViewPagerBinding? = null private val binding get() = _binding!! fun moveToNextQuestionPage() = with(binding) { if(viewpager.currentItem == 7) { val fragment = ResultFragment() parentFragmentManager.commit { replace(R.id.main, fragment) } } else { // 마지막 페이지가 아닌 경우 val nextItem = viewpager.currentItem + 1 viewpager.setCurrentItem(nextItem, true) } }
Question Fragment 에서 ViewPagerFragment의 의 moveToNextQuestionPage 메서드를 부르는 과정에서 오류가 났다. 이유는 binding이 null 인 상태였기 때문이다. 즉, ViewPagerFragment 뷰가 시작되기도 전에, 또는 종료된 후에 메소드가 불린 것이다.
해결방법
해당 오류에 대한 근본적인 해결 방법은 다음과 같다. 뷰페이저 프래그먼트의 메서드를 다른 프래그먼트에서 호출할 때, 뷰페이저 프래그먼트의 뷰가 살아있어야 한다.
이러한 방법을 해결하기 위해 직접 다른 프래그먼트의 메소드로 접근하지 않고 shared view model 을 사용하였다.
shared view model 을 사용하면, QuestionFragment 는 ViewPagerFragment 를 알 필요가 없어진다. QuestionFragment 에서는 이벤트만 발생시키고 ViewPagerFragment 는 해당 이벤트를 옵져빙 하기만 하면 된다.
그리고 옵져빙은 onViewCreated 단계에 작성하여 뷰가 살아있을 때 동작하므로, binding 값이 null이 될 수 없다. 따라서, binding이 null 이 되는 문제점을 해결할 수 있다.
'Android' 카테고리의 다른 글
QA(개발자 계정 생성, 개인정보처리방침 만들기) (0) 2024.06.11 Single Live Event (0) 2024.06.09 팀 프로젝트 트러블 슈팅 - viewmodel scope 의 범위 (0) 2024.05.11 팀 프로젝트 트러블 슈팅 - suspend fun, viewModelScope.launch (0) 2024.05.10 개인 과제 트러블 슈팅 - 인터페이스 변수 초기화 (0) 2024.05.09