-
Android) Navigation Component IllegalStateException, IllegalArgumentException 예외Android 2021. 6. 10. 20:43
Navigation Component를 사용한 앱을 배포했다가, 다음과 같은 예외를 만나게 되었습니다.
java.lang.IllegalStateException...
java.lang.IllegalArgumentException...
일단 검색을 해본 결과 navigate()를 빠르게 2번 호출, 즉 광클하면 이런 예외가 발생하는 것 같습니다.
1. graph.xml내의 fragment에 종속된 Action을 Global Action으로 바꾸기
- 네비게이션 그래프에서 선언된 action을 전역 action으로 바꾸는 것입니다. (저는 이 방법이 통하지 않았습니다.)
2. RxJava의 debounce 오퍼레이터 이용하여 중복된 이벤트 방지하기
- 중복 클릭을 예방하기 위해 debounce 오퍼레이터를 사용하는 것입니다.
- 혹은 처음 클릭된 시간을 저장하고 잠깐의 간격을 둬 간격보다 적은 시간 동안 다시 클릭이 들어오면 막는 방법도 있겠습니다.
- 저는 이 방법도 통하지 않았습니다.
3. fragment 비교
- 현재 프래그먼트의 id와 이동할 프래그먼트의 id를 비교해 다르면 이동을 실행하는 방법입니다.
- 기존의 navigate 대신 extension을 만들어서 사용합니다.
- 함께 보낼 인자가 있다면 넣어줘도 되고 없다면 안넣어줘도 됩니다.
fun NavController.navigateSafe( @IdRes resId: Int, args: Bundle? = null, navOptions: NavOptions? = null, navExtras: Navigator.Extras? = null ) { val action = currentDestination?.getAction(resId) ?: graph.getAction(resId) if (action != null && currentDestination?.id != action.destinationId) { navigate(resId, args, navOptions, navExtras) } }
private fun startDetailFragment(roomCode: String, date: String) { val action = MainFragmentDirections.actionGlobalDetailFragment( roomCode, date, host = false, bookmark = false ) findNavController().navigateSafe(action.actionId, action.arguments) }
Preference
IllegalArgumentException: navigation destination xxx is unknown to this NavController
반응형'Android' 카테고리의 다른 글
Android) Coroutine Exception Handling 어떻게 처리 할까 (0) 2021.06.27 Android) ImageURL -> Bitmap 으로 변경하기 feat) HttpURLConnection, Coroutines (1) 2021.06.24 Android) 안드로이드 고유 식별자 뭘로할까? (6) 2021.06.07 Android) 앱 서명 키 안전하게 보안하는 방법 (0) 2021.05.30 Android) logcat의 ResourceType Warning 지우는 방법 (0) 2021.05.26