es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pasando datos de una actividad a un fragmento en Android Studio Kotlin (no duplicar, esos métodos no funcionan)

Estoy teniendo una actividad llamada “Activity de imagen” dentro de ella hay 2 fragmentos llamados “fragmento de visualización de imagen” y “fragmento de cambio de imagen”, para la actividad de imagen estoy obteniendo datos de un adaptador (usando getIntent) y hasta aquí todo está funcionando bien. Así que quiero enviar los datos (es decir, la URL) al fragmento pero mi método no está funcionando.

Mi código de actividad de imagen es así:

    class ImageActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_image)

       var gi = getIntent()
        var url = gi.getStringExtra("url")
        val fragment = FragmentDisplayImage.newInstance(url.toString())

        Toast.makeText(this,url , Toast.LENGTH_SHORT).show()
        var manager =supportFragmentManager
        manager.beginTransaction().commit()
    }
 }

y mi archivo FragmentImage.kt es así:

private const val ARG_PARAM1 = "url"

class FragmentDisplayImage : Fragment() {

    private var param1: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString("url")
            var image= view?.findViewById<imageview>(R.id.Fragimage)
            Picasso.get().load(param1).resize(700, 700).centerCrop().into(image);
            Toast.makeText(context, param1.toString() , Toast.LENGTH_SHORT).show()
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_display_image, container, false)
    }

    companion object {
        @JvmStatic
        fun newInstance(param1: String) =
            FragmentDisplayImage().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                }
            }
    }
}

Pero aún así, no puedo obtener mi URL aquí en el adaptador.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para enviar datos (por ejemplo, URL) desde una actividad a un fragmento, puedes seguir estos pasos en tu código:

    1. Modifica tu código de ImageActivity para agregar la URL como argumento al fragmento FragmentDisplayImage:

      class ImageActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_image)

              var gi = getIntent()
              var url = gi.getStringExtra("url")
              val fragment = FragmentDisplayImage.newInstance(url)
      
              var manager = supportFragmentManager
              manager.beginTransaction().add(R.id.fragment_container, fragment).commit()
          }
      

      }

    Aquí, obtenemos la URL del Intent y creamos una nueva instancia del fragmento FragmentDisplayImage con la URL como argumento. Luego, agregamos este fragmento a la actividad utilizando un FragmentManager.

    1. Modifica tu código de FragmentDisplayImage para recuperar el argumento de la URL en el método onCreate:

      class FragmentDisplayImage : Fragment() {

          private var imageUrl: String? = null
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              arguments?.let {
                  imageUrl = it.getString("url")
              }
          }
      
          override fun onCreateView(
              inflater: LayoutInflater, container: ViewGroup?,
              savedInstanceState: Bundle?
          ): View? {
              val view = inflater.inflate(R.layout.fragment_display_image, container, false)
              val imageView = view.findViewById<imageview>(R.id.Fragimage)
              Picasso.get().load(imageUrl).resize(700, 700).centerCrop().into(imageView)
              Toast.makeText(context, imageUrl, Toast.LENGTH_SHORT).show()
              return view
          }
      
          companion object {
      
              @JvmStatic
              fun newInstance(imageUrl: String?) =
                  FragmentDisplayImage().apply {
                      arguments = Bundle().apply {
                          putString("url", imageUrl)
                      }
                  }
          }
      

      }

    Aquí, recuperamos el argumento de la URL en el método onCreate y lo almacenamos en la variable imageUrl. En el método onCreateView, inflamos el diseño del fragmento y cargamos la imagen utilizando la biblioteca Picasso. Finalmente, devolvemos la vista inflada.

    Estos cambios deberían permitirte pasar los datos de la URL desde ImageActivity al fragmento FragmentDisplayImage con éxito.

Comments are closed.