본문 바로가기
2023년 이전/Android

FragmentResult

by JeongUPark 2021. 12. 5.
반응형

상황은 이렇다.

  1. FragmentA에서 어떤 리스트를 보여주고 있다.
  2. 그리고 그 리스트에서 한 아이템을 클릭하면 그 아이템에 대한 상세 설명을 보여주는 FragmentB를 보여준다.
  3. FragmentB에서 그 아이템을 삭제한다는 액션을 선택하고 FragmentB가 닫히고 FragmentA가 나타난다.
  4. 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 

 

프래그먼트와 통신  |  Android 개발자  |  Android Developers

프래그먼트와 통신 프래그먼트를 재사용하려면 자체 레이아웃과 동작을 정의하는 완전히 독립된 구성요소로 각 프래그먼트를 빌드합니다. 이러한 재사용 가능한 프래그먼트를 정의한 후에는

developer.android.com

다만 문제가 있다면, navigation을 사용하면 위의 방법이 통하지 않는것 같다. navigation 관련은 여기서 확인하시면 됩니다.

반응형