Sobes.tech
Junior

Come trasferire i dati da un fragmento all'altro?

sobes.tech AI

Risposta dell'AI

  1. Argomenti del Bundle: Utilizzato per passare tipi di dati primitivi e oggetti che implementano Parcelable o Serializable durante 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
    }
    
  2. ViewModel condiviso: I fragmenti appartenenti alla stessa Activity possono usare un ViewModel condiviso 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
    }
    
  3. 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
    }
    
  4. 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
    }