abr
[Tutorial] Como mandar un array de objetos personalizados de una activity a otra.
En (tutoriales) por benoffi7 el 10-04-2011
Comenzamos con el primer tutorial del blog y vamos a hablar sobre como crear una aplicación en Android que mande un array de objetos que hemos creado nosotros de una actividad a otra.
Este tutorial es poca dificultad pero solo es para aquellas personas que han visto algo de programación en Android ya que no me detendré en explicar el funcionamiento de todas las funciones suponiendo que conocen las básicas. Igual es muy fácil de aprender y aunque no conozcan que hace, se pueden dar cuenta al instante.
Contexto: supongamos que tenemos un clase que hemos creado nosotros: CLibro, CParticipante, CJugador, etc. y en algún momento dado cargamos un Array de dichos objetos. Quizás para luego mostrar ese Array o lo que sea, necesitamos pasarla a otra activity. Aquí veremos como.
La forma tradicional de mandar mandar datos a una activity es a través de un Bundle y luego cargarlo a un Intent. Aquí respetaremos esta forma de trabajar pero con algunos cambios.
Lo primero que hacemos es crear la clase que queremos almacenar en un array. Yo particularmente le pongo una “C” a las clase Java que no son activities. Para el tutorial vamos a usar CLibro.
public class CLibro
{
private String titulo;
private String autor;
private String imagen;
public CLibro()
{
}
public CLibro(String Autor, String Imagen, String Titulo)
{
setAutor(Autor);
setImagen(Imagen);
setTitulo(Titulo);
}
Acuerden de crear los GET y los SET de cada atributo.
Por ahora nada difícil, ¿verdad? A llegado la hora de hablar del array. El array que contendrá los libros será una clase Java que extienda de ArrayList y además implementara la interfaz Parceable. Aquí les dejo la referencia oficial sobre esta interfaz para que sepan de que estamos hablando. Android Developers – Parcel.
public class CLista_Libros extends ArrayList<CLibro> implements Parcelable
{
public CLista_Libros()
{
}
public void writeToParcel(Parcel dest, int flags)
{
int size = this.size();
dest.writeInt(size);
for (int i = 0; i < size; i++)
{
CLibro oLibro = this.get(i);
dest.writeString(oLibro.getTitulo());
dest.writeString(oLibro.getAutor());
dest.writeString(oLibro.getImagen());
}
}
public CLista_Libros(Parcel in)
{
readfromParcel(in);
}
private void readfromParcel(Parcel in)
{
this.clear();
//Leemos el tamaño del array int size = in.readInt();
for (int i = 0; i < size; i++)
{
//el orden de los atributos SI importa
CLibro oLibro = new CLibro();
oLibro.setTitulo(in.readString());
oLibro.setAutor(in.readString());
oLibro.setImagen(in.readString());
this.add(oLibro);
}
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
{
public CLista_Libros createFromParcel(Parcel in)
{
return new CLista_Libros(in);
}
public Object[] newArray(int arg0)
{
return null;
}
};
public int describeContents()
{
return 0;
}
}
Lo que hace esta Clase es obtener las funciones básicas de un ArrayList como agregar, eliminar y buscar y además implementa Parceable porque es el tipo de datos que Android nos da para mandar ArrayList personalizados.
Lo métodos más básicos son readfromParcel que se ejecutara cada vez que leemos nuestro array y el método writeToParcel que se lanzara cuando escribimos en el array. Pensemos en esta clase Parcel como un mapeador de objetos que funciona automáticamente. Solo bastan unos pequeños cambios para adaptarla a nuestro entorno.
Vayamos ahora a las activities. Supongamos que tengamos dos layout. Una llamada A_home y otra vercatalogo. Veremos el código del evento onClick botón Agregar.
//levantamos el botón de la interface XML
Button but_agregar=(Button)findViewById(R.id.agregar);
//establecemos el evento onClick
but_agregar.setOnClickListener
(
new OnClickListener()
{
public void onClick(View v)
{
//levantamos los datos ingresados por el usuario los edittex
EditText tex_autor=(EditText)findViewById(R.id.txt_autor);
EditText tex_tapa=(EditText)findViewById(R.id.txt_tapa);
EditText tex_titulo=(EditText)findViewById(R.id.txt_titulo);
//creamos el objeto oLibro
CLibro oLibro=new CLibro(tex_autor.getText().toString(),
tex_tapa.getText().toString(),
tex_titulo.getText().toString());
//lo agregamos a la lista
lista_libros.add(oLibro);
}
}
);
Algo importante que hay que decir que la variable lista_libros es una variable global porque luego la tendremos que usar en el método onClick pero del botón verLibros.
Esa variable se declara así:
public class A_home extends Activity
{
CLista_Libros lista_libros = new CLista_Libros();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
...
Cada vez que presionemos el botón Agregar se cargara el ArrayList con un objeto CLibro que tendrá en su atributos datos provistos por el usuario.
Ahora tenemos que mandar el array a otra activity. Este es código del botón ver.
Button but_ver=(Button)findViewById(R.id.ver);
but_ver.setOnClickListener(
new OnClickListener()
{
public void onClick(View v)
{
//creamos el intento y le pasamos la clase a mostrar
Intent intento=new Intent(A_home.this,vercatalogo.class);
Bundle contenedor=new Bundle();
//le cargamos al bundle un objeto parcelable que se almacenara
//bajo la key "array" y contendrá nuestra lista de libros
contenedor.putParcelable("array",lista_libros);
//cargamos el intento con el bundle
intento.putExtras(contenedor);
//lanzamos el intento
startActivity(intento);
}
}
);
El código no es tan complejo y con los comentarios en las líneas, creo que esta explicado todo.
Tenemos el intento, le cargamos un Parceable que lo guardara con un código llamado “array” y tenga la variable lista_libros que anteriormente cargamos. Y luego se lo damos al intento para que lance la nueva activity.
Veremos ahora “el otro lado” de la aplicación.
public class vercatalogo extends Activity
{
CLista_Libros lista_libros;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.vercatalogo);
Bundle contenedor=getIntent().getExtras();
lista_libros=contenedor.getParcelable("array");
String []lista_titulos=getTitulos(lista_libros);
ArrayAdapter<String> adaptador=
new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,lista_titulos);
final Spinner com_libros = (Spinner) findViewById(R.id.combo_libros);
adaptador.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
com_libros.setAdapter(adaptador);
...
¿Y ahora? ¿Con que se come todo esto? ¡A no desesperarse!
Antes que nada definimos otra variable global para poder utilizarla en toda la activity y poder así quizás mostrar los detalles de los libros en algunos TextView o hacer cualquier tipo de operación.
Luego definimos un Bundle donde guardaremos los “extras” del intento. En estos “extras” obviamente que esta nuestro ArrayList.
En esa variable global almacenaremos el parceable con contenedor.getParceable(“array”);
Vieron como utilizo la key llamada “array”. Esto es así porque los extras se guardan con el par clave-valor. La clave seria “array” y el valor será “lista_libros”.
Una vez que ya recibí mi array y lo convertí a CLista_Libros obtengo los “titulos” de dichos libros y los meto en un array de String llamado lista_titulos. Aquí el método que iría afuera de todo esto.
private String[] getTitulos(CLista_Libros lista_libros)
{
String []lista_titulos=new String[lista_libros.size()];
for (int i=0;i<lista_libros.size();i++)
{
lista_titulos[i]=lista_libros.get(i).getTitulo();
}
return lista_titulos;
}
Hago esto para mostrar esos titulos en un Spinner (un combobox si vienen de otros lenguajes).
El Spinner, por ahora, solo maneja datos simples como cadenas de caracteres o enteros. En otro tutorial veremos como insertar Objetos.
Por ultimo, creamos un Adaptador que hará la intermediación entre los datos y el control de selección, en este caso el Spinner com_libros. Seteamos el Spinner con el adaptador y listo.
El código siguiente es para mostrar los detalles del libro seleccionado. Uso algunos TextView y accedo al arrayList que con el método .get(position) me devuelve un CLibro, por eso puedo acceder a .getTitulo().
Esto a sido todo por hoy. Espero que les haya servido y hayan aprendido algo. Cualquier duda o sugerencia no duden en escribirla en los comentarios de este post que con gusto la responderé.
Gracias por leer, no se olviden de comentar y hasta la post que viene, amigos.
Post Footer automatically generated by Add Post Footer Plugin for wordpress.





