Junior
Come trasferire i dati da un fragmento all'altro?
sobes.tech AI
Risposta dell'AI
-
Argomenti del Bundle: Utilizzato per passare tipi di dati primitivi e oggetti che implementano
ParcelableoSerializabledurante la creazione di una nuova istanza di un fragmento.// Nel fragment di invio val bundle = Bundle().apply { putString("key", "value") } val fragment = TargetFragment().apply { arguments = bundle } // Nel fragment di ricezione override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... utilizzo di value } -
ViewModel condiviso: I fragmenti appartenenti alla stessa Activity possono usare un
ViewModelcondiviso per scambiare dati.// SharedViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // Nel fragment di invio private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.value = "value" // Nel fragment di ricezione private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.observe(viewLifecycleOwner) { value -> // ... utilizzo di value } -
Utilizzo di interfaccia di callback: Un fragment chiama un metodo nell'Activity, e l'Activity poi chiama un metodo in un altro fragment.
// Interfaccia nell'Activity o in un file separato interface DataTransferListener { fun onDataReceived(data: String) } // Nel fragment di invio (activity as? DataTransferListener)?.onDataReceived("value") // Nell'Activity che implementa l'interfaccia override fun onDataReceived(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment targetFragment?.updateUI(data) } // Nel fragment di ricezione fun updateUI(data: String) { // ... aggiornamento UI con i dati } -
API di risultato del Fragment: Metodo moderno e raccomandato per scambiare dati tra fragment.
// Nel fragment di invio (impostare il risultato) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // Nel fragment di ricezione (ascoltare il risultato) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... utilizzo del risultato }