Sobes.tech
Middle

Énumérez toutes les méthodes de transfert de données entre fragments.

sobes.tech IA

Réponse de l'IA

  1. Arguments du Bundle : La méthode la plus courante. Les données sont transmises sous forme de Bundle via la méthode setArguments() du fragment.

    // Dans le fragment émetteur
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... transition vers TargetFragment
    
    // Dans le fragment récepteur
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... utiliser value
    }
    
  2. ViewModel Partagé : Utilisé pour transmettre des données liées au cycle de vie de l'activité ou de plusieurs fragments.

    // Dans le ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // Dans les deux fragments
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // Dans le fragment émetteur
    sharedViewModel.data.value = "données à transmettre"
    
    // Dans le fragment récepteur
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... utiliser data
    }
    
  3. Interfaces de Callback : Le fragment peut définir une interface que l'activité implémente. Le fragment appelle les méthodes de cette interface, transmettant des données à l'activité, qui peut ensuite les transmettre à un autre fragment.

    // Interface dans le fragment émetteur
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Fragment émetteur
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context doit implémenter OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Activité
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Suppose que TargetFragment a la méthode updateData
        }
    }
    
    // Fragment récepteur
    fun updateData(data: String) {
        // ... mettre à jour l'UI ou sauvegarder data
    }
    
  4. API de Résultat de Fragment : Méthode moderne pour transmettre des résultats entre fragments, introduite dans AndroidX Fragment version 1.3.0.

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