Ir al contenido principal

PASO DE PARAMETROS EN ANDROID

Hace unos días estaba implementando una lista genérica en Android para mostrar estadísticas. Para hacerlo necesitaba pasar al Activity que contenía la lista genérica una lista de objetos con la información de cada item de la estadística.

El paso de parámetros de tipos simples en Android es sencillo. Tenemos que establecer en nuestro objeto Intent los parámetros que queremos pasar con el método putExtra(String nombreParametro, String valorParametro). Este método está dsiponible para pasar además de String todos los tipos básicos int, long, float... así como arrays de los mismos.

En la pantalla que llama:

Intent intent= new Intent(FrmEstadisticasEuro.this, ListaGeneral.class);

intent.putExtra("PARAMETRO","VALOR");


En la pantalla que recibe el parámetro:

Bundle extra = this.getIntent().getExtras();
extra.getString("PARAMETRO");

Pero, ¿cómo se pasa un objeto o un array de objetos desde una pantalla a otra?




Para pasar objetos con la clase Intent nuestro objeto debería implementar la interfaz java.io.Serializable así como todos los objetos que contenga. Hacer esto es posible pero no es muy recomendable de cara al rendimiento.

Por suerte Android dispone de la intefaz Parcelable, con la que los programadores podemos indicar cómo serializar nuestros objetos y es un método más eficiente de cara al rendimiento de nuestra aplicación. A continuación os muestro la implementación del objeto que quiero serializar y posteriormente os explicaré con detalle los pasos que he tenido que hacer para conseguirlo:


package es.lottodroid.activity.componentes;

import android.os.Parcel;
import android.os.Parcelable;

public class EstadisticaItem implements Parcelable {

 private int bola;
 private String valorParametro;

 public EstadisticaItem() {
 }

 public EstadisticaItem(int bola, String valorParametro) {
  super();
  this.bola = bola;
  this.valorParametro = valorParametro;
 }

 public EstadisticaItem(Parcel source) {
  bola = source.readInt();
  valorParametro = source.readString();
 }

 public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
  public EstadisticaItem createFromParcel(Parcel in) {
   return new EstadisticaItem(in);
  }

  public EstadisticaItem[] newArray(int size) {
   return new EstadisticaItem[size];
  }
 };

 public int describeContents() {
  return 0;
 }

 public void writeToParcel(Parcel dest, int flags) {
  dest.writeInt(bola);
  dest.writeString(valorParametro);

 }

 public int getBola() {
  return bola;
 }

 public void setBola(int bola) {
  this.bola = bola;
 }

 public String getValorParametro() {
  return valorParametro;
 }

 public void setValorParametro(String valorParametro) {
  this.valorParametro = valorParametro;
 }

}

Implementar Interfaz


Primero debemos implementar de la interfaz android.os.Parcelable.



Creamos un constructor especial



Creamos un constructor pasándole como parámetro un objeto de tipo android.os.Parcel. Este objeto será un contenedor de nuestro objeto. Será el objeto del cual recuperamos nuestros datos en la pantalla destino. 



        public EstadisticaItem(Parcel source) {
  bola = source.readInt();
  valorParametro = source.readString();
        }


IMPORTANTE!!: Crear atributo estático CREATOR

Debemos crear un atributo de tipo static llamado CREATOR de la clase Parcelable.CREATOR. El objeto debe ser similar a esto:

     public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
                    public EstadisticaItem createFromParcel(Parcel in) {
       return new EstadisticaItem(in);
      }
    
      public EstadisticaItem[] newArray(int size) {
       return new EstadisticaItem[size];
      }
     };


Implementar métodos abstractos

Por último debemos implementar los métodos abstractos de la interfaz Parcelable. El primero es int describeContents() el que podemos implementar devolviendo un 0. El segundo es writeToParcel(ParcelDest dest, int flags). En este método es donde rellenamos todos los campos de nuestro objeto para enviarlo desde una pantalla determinada.



        public int describeContents() {
  return 0;
 }

 public void writeToParcel(Parcel dest, int flags) {
  dest.writeInt(bola);
  dest.writeString(valorParametro);

 }


Ahora ya tenemos nuestro objeto preparado para enviarlo de una pantalla a otra. Desde la pantalla que llama construiremos una lista de objetos de tipo EstadisticaItem (el objeto que quiero pasar) y lo pasaremos mediante el método de la clase Intent putParcelableArrayListExtra.


 Intent parcelIntent = new Intent(FrmEstadisticasPrimi.this, ListaGeneral.class); ArrayList dataList = new ArrayList();
 for (int i = 0; i < numero.length; i++) {
     EstadisticaItem e = new EstadisticaItem(numero[i].getNumero(), String.valueOf(numero[i].getApariciones100())  + " veces");
     dataList.add(e);                 
 }                              
 parcelIntent.putParcelableArrayListExtra("lista", dataList);
 startActivity(parcelIntent);  

Desde mi lista genérica que hereda de ListActivity (aunque esto es extensible a cualquier Activity), lo único que tendré que hacer es recoger el parámetro 'lista' con getIntent().getExtras().


 ArrayList dataList = getIntent().getExtras().getParcelableArrayList("lista");


Si queremos recuperar un objeto normal en lugar de un objeto de tipo lista deberíamos utilizar el método getParcelable(String key).

Espero que el pequeño tutorial os sea útil en la implementación de vuestras aplicaciones Android.

Un saludo.

Comentarios

  1. Después de mirarme 3 respuestas en stackoverflow, 2 tutoriales y tú blog, sólo ha sido en tu blog como 1) ha funcionado en mi código y 2) lo he entendido.

    Gracias no, lo siguiente ;)

    ResponderEliminar
  2. Gracias a ti por haber comentado.

    Un saludo.

    ResponderEliminar
  3. no se porque pero a mi no me funciona, se detiene cuando llama a la segunda actividad.... :(

    ResponderEliminar
  4. Realmente ha sido muy bueno encontrar este tutorial, Android es todo un lio en el pase de parametros de una actividad a otra cuando son estructuras.

    ResponderEliminar
  5. Realmente ha sido muy bueno encontrar este tutorial, Android realmente es un lio en cuanto a pase de parametros se refiere siempre que sean estructuras y no datos simples los que se pasan.
    gracias.

    ResponderEliminar
  6. axo! llevaba tiempo dándole vueltas a la cabeza de como hacer esto que explicas jajjajaj gracias maquina voy a darle un repaso, un saludo desde murcia.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Pe...

Soluciones Alchemy Classic 442 elementos

Después de la resaca navideña y de la cuesta de enero, volvemos para informar la agradable sorpresa que nos ha dado a los fans de Alchemy Classic la empresa NIASOF ,  tras actualizar el juego Alchemy Classic. Una nueva versión con 442 elementos , interfaz mejorada de grupos y lo más importante, nuevos elementos que descubrir. La gran novedad de esta actualización son los puntos que tienes asignados , con los que puedes  conseguir pistas sobre los elementos que no has abierto todavía como: Conseguir un subelemento de un elemento, con 100 puntos . Conseguir el grupo de un subelemento de un elemento (qué lío , jeje), con 35 puntos . Me gusta, me gusta el enfoque de esta nueva versión aunque los elementos que han sacado me parecen poco originales. Parece que se van agotando las ideas para los elementos nuevos. Aquí van las soluciones: Carbon = Tierra + Turba Sol = Estrella + Tierra Espacio = 3 x Estrella Estrella = Helio + Hidrógeno Oso Pa...

Alchemy Classic

Dentro de los juegos que he descargado con el Android Market hay dos que destacan sobre todos los demás. El primero es Angry Birds (pájaros furiosos), en el cual comandas un ejercito de pájaros para luchar con una piara de cerdos malotes los cuales han robado sus huevos. Básicamente, tienes que ir pasando nivel tras nivel afinando tu puntería lanzando los pájaros a los cerdos que se esconden tras maderas, cristales y piedras. Pero la verdadera joya que no es tan conocida es Alchemy Classic . En este juego puedes desempeñar el papel  de Dios. Comenzando con 4 elementos básicos, Aire, Agua, Tierra y Fuego tienes que ir obteniendo todos los demás elementos de la creación (animales, plantas, herramientas...) mediante la combinación de los 4 primeros. En total hay 238 elementos. Después de una semana y alguna noche sin dormir por fin los he obtenido todos. El último elemento me ha llevado más de la cuenta por su maravillosa traducción. ¿Qué son abrojos? ¿Lo sabéis? Pues no, ...