Sobes.tech
Middle

Enumere todas las formas de transferencia de datos entre fragmentos.

sobes.tech AI

Respuesta de la IA

  1. Argumentos del Bundle: La forma más común. Los datos se transmiten en forma de Bundle a través del método setArguments() del fragmento.

    // En el fragmento emisor
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... transición a TargetFragment
    
    // En el fragmento receptor
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... usar value
    }
    
  2. ViewModel Compartido: Se usa para transmitir datos relacionados con el ciclo de vida de la actividad o de varios fragmentos.

    // En el ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // En ambos fragmentos
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // En el fragmento emisor
    sharedViewModel.data.value = "datos a transmitir"
    
    // En el fragmento receptor
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... usar data
    }
    
  3. Interfaces de Callback: El fragmento puede definir una interfaz que la actividad implementa. El fragmento llama a los métodos de esta interfaz, pasando datos a la actividad, que luego puede transmitirlo a otro fragmento.

    // Interfaz en el fragmento emisor
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Fragmento emisor
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context debe implementar OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Actividad
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Se asume que TargetFragment tiene el método updateData
        }
    }
    
    // Fragmento receptor
    fun updateData(data: String) {
        // ... actualizar UI o guardar data
    }
    
  4. API de Resultados de Fragmento: Forma moderna de transmitir resultados entre fragmentos, presentada en AndroidX Fragment versión 1.3.0.

    // En el fragmento emisor
    setFragmentResult("requestKey", bundleOf("bundleKey" to "resultado"))
    
    // En el fragmento receptor
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... usar result
    }