Como pasar datos a otra Activity

Objetivo:

Pasar información de una a otra Activity.

Como siempre, tendremos varias alternativas para compartir datos entre las actividades de nuestra aplicación. En este post vamos a tratar una de las más simples: mediante objetos Bundle.

Esta no es la mejor alternativa si deseamos que la información permanezca en un futuro (tras cerrar la aplicación por ejemplo): en ese caso guardarlo en base de datos sería más útil.

Veamos un ejemplo rápido del uso de la clase Bundle. Pasaremos información de una actividad padre a una hija. El código pertenece a Cartelera de Cine, disponible en Android Market, y se pretende pasar la información de una lista de cines y películas de una actividad a otra :

Código fuente java Activity padre:

[sourcecode language=”java”]
//…
//variables que pasaremos a la activity hija
private List<Cine> lista_cines;
private List<Pelicula> lista_peliculas;
//…
/**
* Pasamos dichas variables a la activity hija, llamándola
*/
public void pasarActividadHija(){
//preparo la Intent
Intent itemintent = new Intent(this,activity_hija.class);
//paso la lista de peliculas y cines
itemintent.putExtra("lista_peliculas",(Serializable) this.lista_peliculas);
itemintent.putExtra("lista_cines",(Serializable) this.lista_cines);
//llamamos a la subactividad
startActivityForResult(itemintent, 0);
}
[/sourcecode]

La Activity hija recoge las listas pasadas por la Activity padre. En el método onCreate llamaremos a la función importarInformacion, la cual se encarga de ello:

Código fuente java Activity hija:

[sourcecode language=”java”]
//…
private List<Cine> lista_cines;
private List<Pelicula> lista_peliculas;
//…
/**
* importa la info de que le pasa la Actividad padre
*/
public void importarInformacion(){
Intent startingIntent = getIntent();
if (startingIntent != null) {
Bundle b = startingIntent.getBundleExtra("android.intent.extra.INTENT");
//recibimos la lista de cines
this.lista_cines = (List<Cine>)getIntent().getSerializableExtra("lista_cines");
//recibimos la lista de peliculas
this.lista_peliculas = (List<Pelicula>)getIntent().getSerializableExtra("lista_peliculas");
}
[/sourcecode]

Si lo que deseamos es compartir cadenas de texto, la clase Bundle posee métodos especiales: putString para meter en la instancia del Bundle la cadena (en la Activity padre), y getString para recuperarla (en la Activity hija)

Como programar una rueda de espera ProgressDialog

Objetivo:

Vamos a aprender a crear un ProgressDialog; es decir, un mensaje de espera (junto con una rueda giratoria en este caso) mientras se realizan acciones en segundo plano.

Esto es ideal cuando deseamos que el usuario espere para mostrar estos datos, y al tardar algo de tiempo, deseamos advertirles que esperen.

La aplicación programada en este caso son dos Actividades. La primera llamará a la segunda, la cual debe procesar unos datos antes de mostarlos, y por tanto implementará el ProgressDialog.

Vemos primero una captura de pantalla de la aplicación que vamos a programar:

Programacion Android -ProgressDialog 1Programacion Android -ProgressDialog 2Programacion Android -ProgressDialog 3
     

Código fuente java (/src/Principal.java):

[sourcecode language=”java”]
package com.progressdialog;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class Principal extends Activity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.principal);
}

public void onClick_ExampleApp(View v){
startActivity(new Intent(this, Ejemplo_con_rueda.class));
}
}
[/sourcecode]

Código fuente java (/src/Ejemplo_con_rueda.java):

[sourcecode language=”java”]
package com.progressdialog;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Ejemplo_con_rueda extends Activity {

//variables necesarias
private ProgressDialog pd = null;
private Object data = null;

private TextView texto;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ejemplo_con_rueda);

//asignamos el TextView para mostrar luego los datos procesados
this.texto = (TextView) findViewById(R.id.texto);

// Mostrar el ProgressDialog en este Thread
this.pd = ProgressDialog.show(this, "Procesando", "Espere unos segundos…", true, false);

// Se comienza la nueva Thread que descargará los datos necesarios
new DownloadTask().execute("Parametros que necesite el DownloadTask");
}

/**
* Muestra el texto resultado
* @param String textoAMostrar
*/
public void mostrarResultado(String textoAMostrar){
this.texto.setText(textoAMostrar);
}

/**
* Subclase privada que crea un hilo aparte para realizar
* las acciones que deseemos.
*/
private class DownloadTask extends AsyncTask {
protected String doInBackground(String… args) {
Log.i("Mi app", "Empezando hilo en segundo plano");

// Aqui se realizan las operaciones necesarias
// Como ejemplo, simulamos que se trabaja durante unos segundos con un for
for (int i=1;i }

return "Datos ya procesados (resultado)";
}

protected void onPostExecute(Object result) {
// Pasamos el resultado de los datos a la Acitvity principal
Ejemplo_con_rueda.this.mostrarResultado((String)result);
if (Ejemplo_con_rueda.this.pd != null) {
Ejemplo_con_rueda.this.pd.dismiss();
}
}
}
}
[/sourcecode]

Código fuente XML (/res/layout/principal.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />

<Button android:id="@+id/button_ExampleApp" android:onClick="onClick_ExampleApp"
android:layout_gravity="center" android:layout_width="200dip"
android:layout_height="wrap_content" android:text="actividad 2" />
</LinearLayout>
[/sourcecode]

Código fuente XML (/res/layout/ejemplo_con_rueda.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Datos no procesados aun"
android:id="@+id/texto" />

</LinearLayout>
[/sourcecode]

Descárgate el código aquí

Como programar un Grillview

Objetivo:

Vamos a aprender a crear nuestro primer Grillview.

Requiere algo de experiencia en programación Android, ya que usaremos arrays, y varias subclases para controlar los diferentes botones que incluiremos en el Grillview.

Vemos un resultado final antes.

Ejemplo de un Grillview en Android

Código fuente java (/src/Principal.java):

[sourcecode language=”java”]
package com.grill.view;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;

public class Principal extends Activity {
public static final String[] filesnames = { "Boton 0", "Boton 1", "Boton 2", "Boton 3" };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//Asociamos el Grillview definido en nuestro XML
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ButtonAdapter(this));
}

/**
* Clase necesaria para los botones del Grillview
*/
public class ButtonAdapter extends BaseAdapter {
private Context mContext;

// Se coge el contexto, para poder usarlo luego
public ButtonAdapter(Context c) {
mContext = c;
}

// Numero de cosas que se contienen
public int getCount() {
return filesnames.length;
}

/**
*  Requerido por la estrucura
*/
public Object getItem(int position) {
return null;
}

/**
*  Requerido por la estrucura
*  @param int position
*/
public long getItemId(int position) {
return position;
}

/**
* Requerido por la estructura.
* Se define el estilo de los botones, su id y un listener
* @param int position
* @param View convertView
* @param ViewGroup parent
*/
public View getView(int position, View convertView, ViewGroup parent) {
Button btn;
if (convertView == null) {
// if it’s not recycled, initialize some attributes
btn = new Button(mContext);
//btn.setLayoutParams(new GridView.LayoutParams(100, 55));
btn.setPadding(8, 8, 8, 8);
} else {
btn = (Button) convertView;
}
// filesnames es un array con los nombres de los botones
btn.setText(filesnames[position]);
// definimos un color azul para el texto de los botones, por ejemplo
btn.setTextColor(Color.BLUE);
//podríamos definir una imagen para los botones
// btn.setBackgroundResource(R.drawable.button);
btn.setId(position);
//asociamos un listener a cada boton para recibir los clicks
btn.setOnClickListener(new MyOnClickListener(position));

return btn;
}
}

/**
* Clase listener necesaria para los clicks
*
*/
class MyOnClickListener implements OnClickListener {
private final int position;

public MyOnClickListener(int position) {
this.position = position;
}

/**
* Acciones a realizar cuando se ha pulsado
* alguno de los botones.
* Se podrían definir, por ejemplo, llamar a otras
* actividades.
*/
public void onClick(View v) {
if (this.position==0){
//acciones al pulsar el boton 1
}else if (this.position==1){
//acciones al pulsar el boton 2
}else if (this.position==2){
//acciones al pulsar el boton 2
}else if (this.position==3){
//acciones al pulsar el boton 2
}
//Log en LogCat
System.out.println("PULSADO EL "+this.position);
}
}
}
[/sourcecode]

Código fuente XML (/res/layout/main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />

<!–  Los botones del Grill son definidos en el codigo –>
<GridView android:id="@+id/gridview" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:numColumns="3"></GridView>

</LinearLayout>
[/sourcecode]

Descárgate el código aquí