Sobes.tech
Junior

Comment transmettre des données d'un fragment à un autre?

sobes.tech IA

Réponse de l'IA

  1. Arguments du Bundle : Utilisé pour transmettre des types de données primitifs et des objets implémentant Parcelable ou Serializable lors de la création d'une nouvelle instance de fragment.

    // Dans le fragment émetteur
    val bundle = Bundle().apply {
        putString("key", "value")
    }
    val fragment = TargetFragment().apply {
        arguments = bundle
    }
    
    // Dans le fragment récepteur
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... utilisation de value
    }
    
  2. ViewModel partagé : Les fragments appartenant à une même Activity peuvent utiliser un ViewModel commun pour échanger des données.

    // SharedViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // Dans le fragment émetteur
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.value = "value"
    
    // Dans le fragment récepteur
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.observe(viewLifecycleOwner) { value ->
        // ... utilisation de value
    }
    
  3. Utilisation d'une interface de rappel : Un fragment appelle une méthode dans l'Activity, puis l'Activity appelle une méthode dans un autre fragment.

    // Interface dans l'Activity ou un fichier séparé
    interface DataTransferListener {
        fun onDataReceived(data: String)
    }
    
    // Dans le fragment émetteur
    (activity as? DataTransferListener)?.onDataReceived("value")
    
    // Dans l'Activity implémentant l'interface
    override fun onDataReceived(data: String) {
        val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment
        targetFragment?.updateUI(data)
    }
    
    // Dans le fragment récepteur
    fun updateUI(data: String) {
        // ... mise à jour de l'UI avec les données
    }
    
  4. API de Résultat de Fragment : Méthode moderne et recommandée pour échanger des données entre fragments.

    // Dans le fragment émetteur (définir le résultat)
    setFragmentResult("requestKey", bundleOf("bundleKey" to "value"))
    
    // Dans le fragment récepteur (écouter le résultat)
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... utilisation du résultat
    }