본문 바로가기

개발 노트/Kotlin

[Android] Fragment간 데이터통신 방식

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

 

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

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 프래그먼트와 통신 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 프래그먼트를 재사용하려면 자체

developer.android.com

 

https://velog.io/@sysout-achieve/Android-Fragment%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC-%EB%B0%A9%EB%B2%95%EB%93%A4

 

[Android] Fragment간 데이터 전달 방법들

Fragment간 데이터 전달에 관한 여러 방법들

velog.io

https://www.geeksforgeeks.org/fragment-to-fragment-communication-in-android-using-shared-viewmodel/

 

Fragment to Fragment Communication in Android using Shared ViewModel - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://velog.io/@ilil1/Fragment%EA%B0%84-ViewModel%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC

 

Fragment간 ViewModel로 데이터 전달

1. 프래그먼트 간 데이터 공유

velog.io