Junior
Cum se transferă datele dintr-un fragment în altul?
sobes.tech AI
Răspuns de la AI
-
Argumente de Bundle: Folosite pentru transmiterea tipurilor primitive de date și a obiectelor care implementează
ParcelablesauSerializableatunci când se creează o nouă instanță de fragment.// În fragmentul care trimite val bundle = Bundle().apply { putString("key", "value") } val fragment = TargetFragment().apply { arguments = bundle } // În fragmentul care primește override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... utilizarea valorii } -
ViewModel partajat: Fragmentelor care aparțin aceleiași Activity le poate fi folosit un
ViewModelcomun pentru schimbul de date.// SharedViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // În fragmentul care trimite private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.value = "value" // În fragmentul care primește private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.observe(viewLifecycleOwner) { value -> // ... utilizarea valorii } -
Utilizarea unei interfețe callback: Un fragment apelează o metodă în Activity, iar Activity apoi apelează o metodă în alt fragment.
// Interfață în Activity sau într-un fișier separat interface DataTransferListener { fun onDataReceived(data: String) } // În fragmentul care trimite (activity as? DataTransferListener)?.onDataReceived("value") // În Activity care implementează interfața override fun onDataReceived(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment targetFragment?.updateUI(data) } // În fragmentul care primește fun updateUI(data: String) { // ... actualizarea UI cu datele } -
API-ul de rezultate al fragmentului: Mod modern și recomandat pentru schimbul de date între fragmente.
// În fragmentul care trimite (setarea rezultatului) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // În fragmentul care primește (ascultă rezultatul) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... utilizarea rezultatului }