-
[Android] setFragmentResultListener() 삽질 기록Android📱/삽질 기록... 2024. 4. 20. 20:02
이번에 각 viewModel과 화면의 의존성을 낮추기 위해서 마이그레이션을 하면서 공유 뷰모델의 사용을 최소화하는 작업을 진행하고 있다.
그렇다 보니 fragment에서 결과를 받아오는 과정에서 setFragmentResultListener()를 많이 쓰고 있다.
setFragmentResultListener()
fragment에서 activityResult를 받아 오듯이 이전화면에 데이터를 던져줄 때 사용하는 함수이다.
리스너 등록
setFragmentResultListener(KEY) { _, bundle -> val data = bundle.getString(DATA_KEY) }결과를 받아야하는 fragmentd에서 해당 리스너를 등록해 놓고
데이터 전송
setFragmentResult( LISTENER_KEY, Bundle().apply { putString( ID, "id", ) putString( NAME, "name", ) }, )데이터를 보내주는 fragment에서 해당 방식으로 데이터를 bundle 형태로 넘겨주게 된다.
넘겨주고 navigateUp을 하면 이전 화면에서 리스너가 동작하여 데이터를 받아 오는 형태이다.
문제
이 리스너를 사용하면서 데이터를 전전화면에 던져줘야 하는 상황이 있었는데
이때 문제가 발생하였다.
로그로는 fragment 에러라고만 떠서 에러의 원인을 파악하기 힘들었는데
다행히 키가 될만한 글을 발견하여 문제를 해결하였다.
원인
원인은 fragmentResultListener의 키를 관리하는 방식에 있었다.
전전화면에서도 리스너의 키를 같은 값을 쓰면 편할 거 같아서 같은 키를 썼는데
알고 보니 fragmentResultListener는 키를 Map으로 관리한다는 것을 알았다.
Map은 중복된 키값을 가질 수 없으니 같은 String으로 값을 관리하면 에러가 나는 것이었다.
해결
리스너와 setResult의 키값을 다른 키로 수정하여 해결하였다.
참고
'Android📱 > 삽질 기록...' 카테고리의 다른 글
[Android] xxx is defined multiple times 에러 발생 (0) 2024.05.16 [Android] 안드로이드 접근성 - 화면 크기 조절, 폰트 크기 조정 설정 제거하기 (0) 2024.05.11 [Android] Gson LinkedTreeMap cast 에러 해결 (1) 2024.04.19 Android : 번들 관리의 중요성.... java.lang.RuntimeException:android.os.TransactionTooLargeException (0) 2024.02.09 [Android] Camera Preview가 준비됐는지 알아보기 (0) 2024.02.08