반응형
상황은 이렇다.
- FragmentA에서 어떤 리스트를 보여주고 있다.
- 그리고 그 리스트에서 한 아이템을 클릭하면 그 아이템에 대한 상세 설명을 보여주는 FragmentB를 보여준다.
- FragmentB에서 그 아이템을 삭제한다는 액션을 선택하고 FragmentB가 닫히고 FragmentA가 나타난다.
- FragmentA로 돌아왔을 때 삭제한 항목없이 리스트가 보여진다.
위와 같은 상황을 처리할때 데이터는 ViewModel을 사용하여 처리하면된다.
하지만 UI이 그리는데 어려움이 있었다. 지우고 돌아 왔을 때 FragmentA가 따로 반응하지 않기 때문이다. (만일 onResume을 강제로 불러주었으면 반응 했을지도 모른다... ) 아무튼 이럴때 사용하는 방법이
FragmentResult API이다.
이 API는 Fragment 1.3.0-alpha04이상에서 부터 사용할 수 있고 사용법은 다음과 같다
FragmentA에
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Use the Kotlin extension in the fragment-ktx artifact
setFragmentResultListener("requestKey") { requestKey, bundle ->
// We use a String here, but any type that can be put in a Bundle is supported
val result = bundle.getString("bundleKey")
// Do something with the result
}
}
이렇게 설정하고
FragmentB에
button.setOnClickListener {
val result = "result"
// Use the Kotlin extension in the fragment-ktx artifact
setFragmentResult("requestKey", bundleOf("bundleKey" to result))
}
이렇게하면
FragmentA가 STARTED 상태 (Started state for a LifecycleOwner.) 가 되면 setFragmentResultListener에서 콜백이 실행된다.
더 상세한 설명은
https://developer.android.com/guide/fragments/communicate?hl=ko
다만 문제가 있다면, navigation을 사용하면 위의 방법이 통하지 않는것 같다. navigation 관련은 여기서 확인하시면 됩니다.
반응형