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.
Pasar datos de un Fragmento a otro en Android
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.
Paso 1: establecer datos en fragmento de origen
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.
Paso 2: recibir datos en fragmento de destino
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.
Conclusión
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.
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!