관리 메뉴

나만을 위한 블로그

[Manifest-Android] 18. 액티비티, 프래그먼트 간 데이터 전달 본문

스터디

[Manifest-Android] 18. 액티비티, 프래그먼트 간 데이터 전달

참깨빵위에참깨빵_ 2025. 6. 30. 19:24
728x90
반응형
액티비티 간 데이터 전달

 

가장 일반적인 메커니즘은 인텐트다. 데이터는 키밸류 쌍으로 인텐트에 추가되며 받는 액티비티는 getIntent로 그 데이터를 가져온다.

 

// 보내는 액티비티
val intent = Intent(this, SecondActivity::class.java).apply {
    putExtra("USER_NAME", "John Doe")
    putExtra("USER_AGE", 25)
}
startActivity(intent)

// 받는 액티비티
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val userName = intent.getStringExtra("USER_NAME")
        val userAge = intent.getIntExtra("USER_AGE", 0)
        Log.d("SecondActivity", "User Name: $userName, Age: $userAge")
    }
}

 

프래그먼트 간 데이터 전달

 

전송하는 프래그먼트는 키밸류 쌍으로 구성된 번들을 만들고 매개변수로 보내서 받는 프래그먼트에 전달한다.

 

제트팩 네비게이션 라이브러리를 써서 프래그먼트 간 데이터 전달

 

제트팩 네비게이션 라이브러리, safeArgs를 같이 쓸 때 목적지 간 타입 안전 네비게이션을 가능하게 하는 direction, argument 클래스를 만들 수 있다.

 

Shared ViewModel 활용

 

같은 액티비티 안에서 프래그먼트끼리 통신해야 할 경우 shared viewmodel 사용이 권장된다.

shared viewmodel은 같은 액티비티 안의 여러 프래그먼트 간 공유되는 뷰모델 인스턴스를 말한다. 제트팩의 androidx.fragment:fragment-ktx 패키지에서 ㅈ공하는 activityViewModels()를 써서 구현된다.

activityViewModels()는 뷰모델의 scope를 액티비티에 지정해서 프래그먼트가 같은 뷰모델 인스턴스에 접근하고 공유할 수 있게 한다. 이것은 프래그먼트 간의 밀접한 결합을 피하고 생명주기를 인식하는 반응형 데이터 공유를 가능하게 한다.

 

// Shared ViewModel
class SharedViewModel: ViewModel() {

  private val _userData = MutableStateFlow<User?>(null)
  val userData: StateFlow<User?> = _userData
  
  fun setUserData(user: User) {
    _userData.value = user
  }
}

// Fragment A (Sending data)
class FirstFragment : Fragment() {
    private val sharedViewModel: SharedViewModel by activityViewModels()

    fun updateUser(user: User) {
        sharedViewModel.setUserData(user)
    }
}

// Fragment B (Receiving data on another Fragment)
class SecondFragment : Fragment() {
    private val sharedViewModel: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
                sharedViewModel.userData.collectLatest { user ->
                    // handle user data here
                }
            }
        }
    }
}

// Activity (Receiving data on the Activity)
class MainActivity : ComponentActivity() {
    private val sharedViewModel: SharedViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycleScope.launch {
            lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
                sharedViewModel.userData.collectLatest { user ->
                    // handle user data here
                }
            }
        }
    }
}

 

반응형
Comments