Sobes.tech
Middle

Elenca tutti i modi di trasferimento dei dati tra i frammenti.

sobes.tech AI

Risposta dell'AI

  1. Argomenti del Bundle: Il metodo più comune. I dati vengono trasmessi come Bundle tramite il metodo setArguments() del fragment.

    // Nel fragment mittente
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... transizione a TargetFragment
    
    // Nel fragment destinatario
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... utilizza value
    }
    
  2. ViewModel Condiviso: Usato per trasmettere dati legati al ciclo di vita dell'attività o di più fragment.

    // Nel ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // In entrambi i fragment
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // Nel fragment mittente
    sharedViewModel.data.value = "dati da trasmettere"
    
    // Nel fragment destinatario
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... utilizza data
    }
    
  3. Interfacce di Callback: Il fragment può definire un'interfaccia che l'attività implementa. Il fragment chiama i metodi di questa interfaccia, passando dati all'attività, che può poi passarli ad un altro fragment.

    // Interfaccia nel fragment mittente
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Fragment mittente
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context deve implementare OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Attività
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Si presume che TargetFragment abbia il metodo updateData
        }
    }
    
    // Fragment destinatario
    fun updateData(data: String) {
        // ... aggiorna UI o salva data
    }
    
  4. API di Risultato del Fragment: Metodo moderno per trasmettere risultati tra fragment, introdotto in AndroidX Fragment versione 1.3.0.

    // Nel fragment mittente
    setFragmentResult("requestKey", bundleOf("bundleKey" to "risultato"))
    
    // Nel fragment destinatario
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... utilizza result
    }