Como transferir objetos entre layouts.
Autor: Rafa | Publicado: 2011-01-26T11:25:00-02:00

Olá amigos.

Neste post veremos como é possível passar um valor de uma página (layout) para outra página em uma aplicação Android.
Existe uma pequena diferença entre passar um objeto do tipo primitivo e um objeto composto.
Abordaremos ambas as soluções a seguir.

A funcionalidade é bem parecida com uma implementação de Map, do Java, onde você cria um objeto e nele você seta um objeto e sua respectiva chave e o recupera posteriormente.

Para passar um simples objeto.
Para "chamar" uma nova página, criamos um objeto do tipo Intent, como já vimos no blog.
Para passarmos algum valor/objeto entre telas, precisamos adicionar "extras" no nosso objeto, da forma descrita abaixo:

// Cria a chamada para a página Page2
Intent myIntent = new Intent(v.getContext(), Page2.class);

// seta um valor extra, utilizando uma chave e um valor.
myIntent.putExtra("chaveTeste", "Novo Objeto");

// Inicia a nova página.
startActivity(myIntent);

Chamamos o método putExtra(chave,valor) passando uma "chave" que é um identificador para você poder recuperar o valor passado em outra tela e também pare diferenciar caso você passe outros valores no mesmo Intent. E também passasse como segundo paramêtro um valor, que pode ser um objeto do tipo primitivo ou composto. 
Para ver a lista de objetos aceitos pelo método, favor checar na API do Android : http://developer.android.com/reference/android/content/Intent.htm

Agora, na outra tela, precisamos resgatar este valor, portanto fazemos da seguinte maneira:

Bundle extras = getIntent().getExtras();
String novoTexto = (String) extras.get("chaveTeste");
Simples não? Só precisamos chamar o método getIntent() e o getExtras() dele que teremos um objeto do tipo Bundle, que contém os valores passados neste Intent. Depois disso, basta usarmos o método .get() passando a chave utilizada que recuperamos o objeto. Você precisará fazer um Cast para o seu tipo, pois o método extras.get() retorna um Object.

Para passar um objeto criado por você.
Para essa situação, seu objeto deve implementar a interface Parcelable, como fiz no exemplo abaixo:

package com.navegandoentrelayouts;

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

public class Usuario implements Parcelable {

&nbsp;&nbsp;&nbsp; // Propriedades
&nbsp;&nbsp;&nbsp; private long registro;
&nbsp;&nbsp;&nbsp; private String nome;

&nbsp;&nbsp;&nbsp; // Construtores
&nbsp;&nbsp;&nbsp; public Usuario() {
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; public Usuario(long registro, String nome) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super();
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.registro = registro;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.nome = nome;
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; public Usuario(Parcel in) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; readFromParcel(in);
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; // Getters e setters
&nbsp;&nbsp;&nbsp; public long getRegistro() {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return registro;
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; public String getNome() {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return nome;
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; public void setRegistro(long registro) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.registro = registro;
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; public void setNome(String nome) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.nome = nome;
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; // Método auxilirares
&nbsp;&nbsp;&nbsp; @Override
&nbsp;&nbsp;&nbsp; public int describeContents() {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0;
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; @Override
&nbsp;&nbsp;&nbsp; public void writeToParcel(Parcel out, int flags) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.writeLong(registro);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.writeString(nome);
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; private void readFromParcel(Parcel in) {

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; registro = in.readLong();
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; nome = in.readString();
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; @SuppressWarnings("unchecked")
&nbsp;&nbsp;&nbsp; public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public Usuario createFromParcel(Parcel in) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Usuario(in);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public Usuario[] newArray(int size) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Usuario[size];
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; };
}

O próximo passo é setar o objeto no Intent:

// Cria a chamada para a página Page2
Intent myIntent = new Intent(v.getContext(), Page2.class);

// Crio o meu objeto.
Usuario usuario = new Usuario(15L, "Rafael");

// seta um valor extra, utilizando uma chave e um valor.
myIntent.putExtra("usuario", usuario);

// Inicia a nova página.
startActivity(myIntent);
Para recuperar o objeto enviado utilizaremos uma outra forma. E é por esta razão que implementamos a interface Parcelable.
Desta vez, você não irá chamar o método .get() para recuperar o Bundle, e sim o método getParcelable(), onde você passa a mesma chave que passou para setar o objeto no Intent.

Veja o exemplo:

// Passa a chave, faz um Cast e tenha o objeto
Usuario usuario = (Usuario) extras.getParcelable("usuario");
Pronto. Agora você já tem o objeto recuperado na outra tela e pode trafegar informações entre elas.