Sobes.tech
Junior

¿Cómo transferir datos de un fragmento a otro?

sobes.tech AI

Respuesta de la IA

  1. Argumentos del Bundle: Se utilizan para pasar tipos de datos primitivos y objetos que implementan Parcelable o Serializable al crear una nueva instancia de un fragmento.

    // En el fragmento que envía
    val bundle = Bundle().apply {
        putString("key", "value")
    }
    val fragment = TargetFragment().apply {
        arguments = bundle
    }
    
    // En el fragmento que recibe
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... uso de value
    }
    
  2. Shared ViewModel: Los fragmentos que pertenecen a una misma Activity pueden usar un ViewModel compartido para intercambiar datos.

    // SharedViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // En el fragmento que envía
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.value = "value"
    
    // En el fragmento que recibe
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.observe(viewLifecycleOwner) { value ->
        // ... uso de value
    }
    
  3. Usando interfaz de callback: Un fragmento llama a un método en la Activity, y la Activity luego llama a un método en otro fragmento.

    // Interfaz en la Activity o en un archivo separado
    interface DataTransferListener {
        fun onDataReceived(data: String)
    }
    
    // En el fragmento que envía
    (activity as? DataTransferListener)?.onDataReceived("value")
    
    // En la Activity que implementa la interfaz
    override fun onDataReceived(data: String) {
        val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment
        targetFragment?.updateUI(data)
    }
    
    // En el fragmento que recibe
    fun updateUI(data: String) {
        // ... actualización de la UI con los datos
    }
    
  4. API de Resultados de Fragmentos: Método moderno y recomendado para intercambiar datos entre fragmentos.

    // En el fragmento que envía (establece el resultado)
    setFragmentResult("requestKey", bundleOf("bundleKey" to "value"))
    
    // En el fragmento que recibe (escucha el resultado)
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... uso del resultado
    }