마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

A Fragment → Activity → B Fragment 데이터 전달 방법

0 추천
A라는 fragment에서 데이터를 액티비티에 저장해놓고 여러 B,C,D라는 fragment에서 가져와 쓰고 싶습니다.

방법이 있을까요? 예제나 방법 알고 싶습니다.
개발자데데 (180 포인트) 님이 2022년 3월 23일 질문

1개의 답변

+1 추천
 
채택된 답변

님의 경우에는 액티비티 말고 데이터 저장소(메모리, 파일, SharePreferences, DB 등)를 사용해서 이 저장소 인스턴스를 공유하면 될 것 같습니다. 간단히 싱글톤 오브젝을 하나 만드시고 이걸 공유해서 사용하시면 될 것 같아요. 예를 들면, 아래처럼 간단하게 Singleton을 하나 만들어서 공유하실 수 있습니다. Singleton이 적합하지 않다면 일반적인 클래스를 Application class에서 생성해서 공유할 수도 있습니다.

object DataShare {
   
    private val store = hashMapOf<String, DataType>()

    fun DataType? getData() {
         return store["KeyName"]
    }

    fun setData(value: DataType) {
        store["KeyName"] = value
    }
}

 

데이터를 공유할 곳에서는 아래처럼 메모리에 저장하고

// String type을 예로 들면,

DataShare.setData("blablabla")

 

사용할 곳에서는 읽어오면 되겠죠.

val myData = DataShare.getData() ?: ""

 

Application class를 이용한다면, 아래처럼 Activity에서 Application 을 참조해서 사용할 수 있습니다.

// Singleton을 일반 클래스로 변경
class DataShare {
    ...
}

class MyApp: Application() {

      private val dataShare by lazy { DataShare() }

     
}

class MyActivity: AppCompatActivity {

      private val dataShare by lazy {
               (application as MyApp).dataShare
      }

     
}


class MyFragment : Fragment() [
    
     private val dataShare by lazy {
               (requireActivity().application as MyApp).dataShare
      }
     
}

 

저는 메모리를 공유하는 아주 간단한 방법을 사용했습니다만, 여기에는 다른 접근방법들이 많이 있으니, 검색을 더 해보시기 바랍니다. 예를 들면 ViewModel 공유라던가, Jetpack DataStore 등등. 가능하다면, Activity의  intent에 데이터를 저장해 볼 수도 있을 것 같네요.

spark (227,830 포인트) 님이 2022년 3월 23일 답변
개발자데데님이 2022년 3월 23일 채택됨
아 감사합니다 해결했습니다 감사합니다
아래처럼 Activity의 intent를 이용해서 저장할 수도 있을 것 같습니다. 별 문제가 없다면, 제일 간단하면서 안전한 방법처럼 보이네요. 라이프사이클에도 안전하구요.
requireActivity().intent.putExtra("KeyName", "a value")

val savedString = requiteActivity().intent.getStringExra("KeyName") ?: ""
...