1. FragmentManager에 Bundle로 Data를 담아 전달
//PassBundleFragment는 본인이 전달하고자 하는 Fragment class
val bundle = Bundle()
bundle.putString("key", "value")
val passBundleBFragment = PassBundleBFragment()
passBundleBFragment.arguments = bundle parentFragmentManager.beginTransaction()
.replace(R.id.fragment_container_bundle, PassBundleFragment())
.commit()
-> 데이터를 전송하려는 Fragement에서 작성
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
var result = arguments?.getString("key")
return inflater.inflate(R.layout.fragment_pass_b, container, false)
}
-> 데이터를 받을 Fragment에서 작성
2. ViewModel을 사용하여 데이터 전달
Activity에 포함된 둘 이상의 프래그먼트는 ViewModel을 통해서 데이터 공유가 가능하다
위 그림과 같이 Fragment들은 각자의 ViewModel를 가질 수도 있고 Activity의 ViewModel을 공유해서 사용할 수도 있다
1) Fragment1
class Fragment1 : Fragment() {
private val sharedViewModel: SharedViewModel by activityViewModels()
private lateinit var binding: Fragment1Binding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = Fragment1Binding.inflate(inflater, container, false)
binding.buttonFragment1.setOnClickListener {
sharedViewModel.updateText(binding.editTextFromFragment1.text as Editable)
}
sharedViewModel.getData().observe(viewLifecycleOwner, Observer {
binding.editTextFromFragment1.text = it as Editable
})
return binding.root
}
}
sharedViewModel.getData().observe()를 통해서 ViewModel에 선언된 MutableLiveData의 data 값이 변하는지 관찰한다
이러한 옵저빙을 통해서 데이터 변환이 감지되면 text값을 갱신해 준다
2) Fragment2
class Fragment2 : Fragment() {
private lateinit var binding: Fragment2Binding
private val sharedViewModel: SharedViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = Fragment2Binding.inflate(inflater, container, false)
binding.buttonFragment2.setOnClickListener {
sharedViewModel.updateText(binding.editTextFromFragment2.text as Editable)
}
sharedViewModel.getData().observe(viewLifecycleOwner, Observer {
binding.editTextFromFragment2.text = it as Editable
})
return binding.root
}
}
3) SharedViewModel
class SharedViewModel : ViewModel() {
private var inputText: MutableLiveData<CharSequence> = MutableLiveData()
fun getData(): MutableLiveData<CharSequence> = inputText
fun updateText(input: CharSequence) {
inputText.value = input
}
}
3) MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.apply {
add(R.id.fragment_1_holder, Fragment1())
add(R.id.fragment_2_holder, Fragment2())
commit()
}
}
}
3. Fragment Result API를 사용하여 데이터 전달
Fragment Result API는 프래그먼트 간에 또는 호스트 액티비티와 프래그먼트간에 일회성 값을 전달하는 경우 사용할 수 있다. 예를 들어 QR 코드를 읽고 이전 프래그먼트로 데이터를 다시 전달하는 프래그먼트가 있을 수 있다
먼저 의존성을 추가해준다
dependencies {
...
implementation "androidx.fragment:fragment-ktx:1.3.0"
}
//PassBundleFragment는 본인이 전달하고자 하는 Fragment class
//fragment_container_bundle은 본인의 Fragment가 담겨있는 Container
button.setOnClickListener {
val result = "result"
setFragmentResult("requestKey", bundleOf("bundleKey" to result))
parentFragmentManager.beginTransaction()
.replace(R.id.fragment_container_bundle, PassBundleFragment())
.commit()
}
-> 데이터를 전송하려는 Fragement에서 작성
setFragmentResultListener("requestKey") { requestKey, bundle ->
val result = bundle.getString("bundleKey")
// Do something with the result
}
-> 데이터를 받을 Fragement에서 작성
# 공식문서와 참고한 자료
https://developer.android.com/guide/fragments/communicate?hl=ko
https://www.geeksforgeeks.org/fragment-to-fragment-communication-in-android-using-shared-viewmodel/
'개발 노트 > Kotlin' 카테고리의 다른 글
[Android/Kotlin] Activity, Fragment간 데이터 주고받기 (0) | 2024.04.10 |
---|---|
[Android/Kotlin] 세로/가로 모드 ui 분리 구현 (1) | 2024.04.07 |
[Android] Fragment Lifecycle (0) | 2024.03.29 |
[Android] Activity Stack 및 backStack (0) | 2024.03.29 |
버튼 눌렀을때 Fragment화면 나타내기 (0) | 2024.03.28 |