Middle
List all ways of data transfer between fragments.
sobes.tech AI
Answer from AI
-
Bundle arguments: The most common method. Data is passed via a Bundle through the fragment's
setArguments()method.// In the sender fragment val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... transition to TargetFragment // In the receiver fragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... use the value } -
Shared ViewModel: Used for passing data related to the activity's or multiple fragments' lifecycle.
// In ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // In both fragments private val sharedViewModel: SharedViewModel by activityViewModels() // In the sender fragment sharedViewModel.data.value = "data to pass" // In the receiver fragment sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... use the data } -
Callback Interfaces: The fragment can define an interface implemented by the activity. The fragment calls methods of this interface, passing data to the activity, which can then pass it to another fragment.
// Interface in the sender fragment interface OnDataPass { fun onDataPass(data: String) } // Sender fragment private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context must implement OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Activity class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Assumes method updateData in TargetFragment } } // Receiver fragment fun updateData(data: String) { // ... update UI or save data } -
Fragment Result API: A modern way to pass results between fragments, introduced in AndroidX Fragment version 1.3.0.
// In the sender fragment setFragmentResult("requestKey", bundleOf("bundleKey" to "result")) // In the receiver fragment setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... use the result }