Ya hemos visto anteriormente cómo hacer la transición de un fragmento a otro en Android usando Java, de manera programada.
Ahora veremos cómo ir de un fragmento a otro pero pasando datos, es decir, compartir datos de un fragmento origen a un fragmento de destino.
Te recomiendo encarecidamente que visites el post anterior para que aprendas lo básico, no te llevará mucho tiempo.
Para pasar datos de un fragmento a otro simplemente creamos un Bundle
y llamamos al método setArguments
del fragmento.
Por cierto, para importar el Bundle escribe al inicio import android.os.Bundle
.
En el fragmento al que le pasamos los datos llamamos a getArguments
y listo, recuperamos el Bundle
.
La parte importante es en donde le ponemos los datos al Bundle usando los métodos putXXXX
en donde XXXX
es un tipo de dato. La sintaxis es:
bundle.putXXXX(clave, valor);
Los métodos que soporta son:
Te digo como recomendación que si quieres pasar un dato que puedes recuperar de una base de datos, pases únicamente el id y dentro del fragmento obtengas el objeto completo traído de la base de datos.
Ahora sí veamos cómo hacer la transición y pasar datos. En el fragmento de origen se necesita este código, el cual crea un bundle y establece los argumentos para llamar al otro fragmento:
//Crear bundle, que son los datos que pasaremos
Bundle datosAEnviar = new Bundle();
// Aquí pon todos los datos que quieras en formato clave, valor
datosAEnviar.putLong("id", 123L);
// Y puedes pasarle más datos..
datosAEnviar.putInt("edad", 21);
datosAEnviar.putString("nombre", "Parzibyte");
// Preparar el fragmento
Fragment fragmento = new GastosFragmentEditar();
// ¡Importante! darle argumentos
fragmento.setArguments(datosAEnviar);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_principal, fragmento);
fragmentTransaction.addToBackStack(null);
// Terminar transición y nos vemos en el fragmento de destino
fragmentTransaction.commit();
La única diferencia con el post en donde hacemos la transacción es que ahora usamos Bundle y le ponemos algunos datos. Eres libre de ponerle los datos que quieras, siempre y cuando no repitas claves.
En el fragmento en donde vamos a recibir los datos sobrescribimos al método onViewCreated
(esto es cuando la vista ya se ha creado, lo recomiendo) y obtenemos el Bundle con getArguments
.
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
Bundle datosRecuperados = getArguments();
if (datosRecuperados == null) {
// No hay datos, manejar excepción
return;
}
// Y ahora puedes recuperar usando get en lugar de put
long id = datosRecuperados.getLong("id");
int edad = datosRecuperados.getInt("edad");
String nombre = datosRecuperados.getString("nombre");
// Imprimimos, pero en tu caso haz lo necesario
Log.d("GastosFragmentEditar", "El ID: " + id);
Log.d("GastosFragmentEditar", "La edad: " + edad);
Log.d("GastosFragmentEditar", "El nombre: " + nombre);
}
Ahora en lugar de llamar a putXXXX
llamamos a getXXXX
y eso nos devolverá los datos que pasamos en el fragmento.
Estamos imprimiendo en el monitor de Android usando Log, al llamarlo muchas veces la salida es esta:
En mi caso estoy pasando un id distinto a partir de una lista, pero con eso queda demostrado que todo esto funciona.
Vimos cómo usando la clase Bundle
y Fragment
con los métodos getArguments
, setArguments
y getXXXX
con putXXXX
sirven para pasar datos entre fragmentos de una manera fácil.
Es importante comprobar que los datos pasados de un fragmento a otro no sean nulos, porque si no lo hacemos estamos propensos a obtener un error de tipo NullPointerException.
Te invito a ver más sobre Android o Java en general.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Me sirvió muchísimo, muchas gracias, no tengo dinero, si no si te doy una donacion.
Todo un capo! Estaba sufriendo con mandar datos entre fragments hasta que encontre tu post
Un placer ayudar. Si el post te gustó, te invito a seguirme y compartir mi contenido
Saludos :)
En que parte de nuestro código se ubica el paso uno.
Ya se que es en el fragmento que desea enviar los datos, pero no se que parte, si en el OnCreate o en el OnCreateView
Muchas Gracias!