Programación Android, enviar datos a una segunda Activity

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

En esta entrada vamos a explicar cómo se deben enviar datos a una segunda Activity para poder recogerlos en esta segunda Activity y mostrarlos en pantalla.

Para esto, en el Layout de la primera actividad hemos introducido un EditText en el que escribiremos el texto que queremos que se muestre en la segunda actividad, y un botón que va a recoger este texto y va a iniciar la segunda actividad, pasándole los datos.
El layout quedaría así:
Layout Activity1

En el archivo .java que representa nuestra actividad lo primero que hacemos es establecer la referencia al EditText, para poder recoger el texto que el usuario introduzca en él, y después escribiremos el método que se va a lanzar cuando se haga click en el botón. En nuestro proyecto esta clase la tendremos dentro de la carpeta src/nuestro.package/clases.java:
Activities

En dicho archivo escribiremos el código que nos va a permitir establecer la referencia al EditText mencionado:

// Necesitamos declarar la variable para poder utilizar el EditText que
// hemos incluído en el Layout, lo instanciamos aquí para que el objeto sea
// utilizable en toda la clase. Es recomendable instanciar en esta zona
// todas las variables que queramos utilizar a lo largo de nuestro código,
// de manera que quede ordenado y sea fácilmente localizable nuestra
// variable.
EditText etDatos;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.pasar_datos_bundle_main);

	// Establecemos la referencia al EditText del Layout, esto lo hacemos
	// buscando en R.java el ID del elemento. Lo hacemos aquí porque este
	// método se va a lanzar con la ejecución de nuestra Activity, así
	// siempre estará inicializado antes de que vayamos a hacer algo en la
	// aplicación.
	etDatos = (EditText) findViewById(R.id.etDatos);
}

Y posteriormente escribimos el método que se lanzará al hacer click en el botón. El nombre del método que se lanza con el click está establecido en el XML de la vista, para facilitar el no tener que instanciar aquí un listener (en futuras entradas explicaremos cómo instanciar los listeners que permitirán ejecutar acciones cuando se producen determinados eventos, como un click, una pulsación larga, un cambio de estado, etc.):

/**
 * Método al que el botón hace referencia en su evento "onClick". En el
 * Layout hemos indicado que apunte a este método.
 *
 * @param v
 */
public void onClick(View v) {

	// Comprobamos que el EditText contenga algo escrito, de no tener nada
	// escrito no hará nada cuando se pulse el botón.
	if (etDatos.getText().length() != 0) {

		// Utilizamos un objeto de la clase Bundle para incluir un par
		// "Clave/Valor", este objeto tendrá como clave "datos", y su valor
		// será el texto que se introduzca en el EditText.
		Bundle b = new Bundle();
		b.putString("datos", etDatos.getText().toString());

		// La clase Intent establece un link entre esta Activity y la nueva
		// que queremos lanzar, para ello al instanciar el Intent
		// introducimos como parámetros esta propia Activity, y la clase que
		// representa a la nueva Activity.
		Intent i = new Intent(PasarDatosBundleMain.this,
				SegundaActivity.class);

		// En el Intent añadimos el Bundle, para que lleve la información a
		// la siguiente Activity.
		i.putExtras(b);

		// Lanzamos la siguiente Activity.
		startActivity(i);
	}
}

Como vemos en el código, instanciamos un Intent que hará la llamada a la segunda actividad, un Bundle que contendrá la información que queremos mandar a dicha actividad, e introducimos dicha información en el Intent para poder enviarla.

Escribiendo la segunda Activity:

Una vez hecho esto, sólo tenemos que capturar la información en la segunda actividad y mostrarla en la pantalla.
Para poder utilizar esta segunda actividad, antes tenemos que introducirla en nuestro proyecto. Esto se hace dando al botón izquierdo de nuestro ratón sobre nuestro package y le damos a new/others:
Nueva activity1

Y nos saldrá una ventana que nos permitirá elegir una nueva Activity:
Nueva activity2

Ahora sólo tenemos que darle un nombre con el que podamos distinguir esta segunda Activity, y automáticamente añadirá también el Layout asignado a dicha Activity:
Nueva activity3

El Layout aprovecharemos el TextView que viene ya por defecto, con el más que clásico “Hola Mundo”, sólo he modificado el texto que se muestra inicialmente en el Layout, pero al lanzar la Activity no llegará a verse, ya que automáticamente pondrá el texto que hemos mandado desde la Activity anterior:
Layout Activity2

Ahora, en nuestra Activity vamos a recoger la información que hemos mandado desde la anterior, para, como hemos dicho, mostrarlo en el TextView. Al igual que en la primera Activity, instanciaremos un objeto, en este caso TextView, para poder actualizar el texto del Layout:

// TextView que hemos establecido en el Layout.
private TextView tvMostrarDatos;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.segunda_activity);

	// Establecemos la referencia al TextView para poder utilizarlo en el
	// código.
	tvMostrarDatos = (TextView) findViewById(R.id.tvMostrarDatos);

	// Sacamos el intent con el que se ha iniciado la Activity.
	Intent i = getIntent();

	// Del intent sacamos el Bundle en el que hemos introducido los datos en
	// la primera Activity.
	Bundle b = i.getExtras();

	// Comprobamos que el Bundle contenga datos, para evitar posibles
	// errores. Si no lo comprobamos y el Intent no tiene incorporado un
	// bundle, al intentar utilizar el bundle después nos saltará una
	// excepción por intentar un objeto que no existe
	// (NullPointerException).
	if (b != null) {
		String datos = b.getString("datos");

		// Establecemos el texto del TextView a partir de la cadena de texto
		// que hemos sacado del Bundle.
		tvMostrarDatos.setText(datos);

		// Se puede hacer la asignación directamente:
		tvMostrarDatos.setText(getIntent().getExtras().getString("datos"));
	}
}

Como vemos en el código, lo primero que hacemos es instanciar el TextView que queremos utilizar, y después accedemos al Intent que ha iniciado la Activity, luego al Bundle que contiene la información que hemos mandado, y por último sacamos la cadena de texto que introducimos en el Bundle a través de la clave que lo identifica. Una vez que hemos sacado esta cadena de texto, actualizamos el texto de nuestro TextView con dicha cadena.
El resultado será que nuestra segunda Activity mostrará el texto introducido en el EditText de la primera Activity, y aunque inicialmente en el XML hemos escrito un texto, éste no llegaremos a verlo nunca, lo que nos permite eliminar el atributo “android:text” del TextView en el archivo XML.

Descargas

Puedes ver el resultado del ejemplo en tu móvil descargando nuestra aplicación desde Google Play.

Puedes acceder a nuestro repositorio para bajar el proyecto aquí.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

10 thoughts on “Programación Android, enviar datos a una segunda Activity

  1. Me ha encantado tu tutorial y me ha servido muchísimo.
    Pero tengo una duda,sabrías de que manera podría pasar una foto de una actividad a otra(siendo la misma).Es decir tengo una principal y otra para animarla y quiero que la foto cogida en la actividad principal pase a la otra actividad por medio de un botón…
    Podrías ayudarme,Un saludo.

  2. Sabes si es posible pasar el nombre de una variable?

    Ahora mismo estoy haciendo unos botones que son imagenes y quiero que salga el nombre de la imagen clickada en otra actividad.

    Un saludo y gracias.

    1. No sé si la imagen que tienes es un recurso del proyecto o la estás recogiendo de la galería. En cualquier caso la variable que estés utilizando tiene un valor, y al final es ese valor el que tendrás que utilizar.

      Hace un tiempo tuve que pasar una variable bitmap a través del bundle. Por defecto no se puede, por lo que creé una clase que extiende de bitmap e implementa serializable, de esta forma se puede meter en el bundle como “MiClase” y utilizarla como bitmap después. Al recoger el valor de la imagen se la asignas al control que quieras y listo.

      Si se trata de un recurso del proyecto es más sencillo recoger la id del recurso y pasarla a través del bundle.

      Un saludo.

  3. hola,ya lo corregi, es que en mi ejemplo manejo otros nombres, realmente que tonto ! jajajajaj gracias por compartir todo esto!

  4. hola, muchas gracias por las lecciones ,realmente nos sirve a los que estamos empezando, tengo una duda, al escribir esta linea “etDatos = (EditText) findViewById(R.id.etDatos);”
    Eclipse me dice que no debo modificar manualmente el archivo R.java y me sale error, no e deja corregirlo. Estoy trancado ahi, por favor pediria tu ayuda, como puedo resolverlo.?
    Gracias de antemano.

Deja un comentario