Android Como enviar parámetros entre Activities usando Parcelable

By | 03/03/2017

Porque usar Parcelable

Para enviar objetos entre Activities tienes dos formas convenientes.
Una de ellas es enviando un objeto Serializable y la segunda es enviando un Parcelable.

La serialización en Android es bastante lenta y no se recomienda para el envío de objetos entre Activities. Por esto Android creo Parcelable para resolver este problema. Parcelable es mucho más rápido que la serialización estándar aunque su implementación requiere un poco más de trabajo.

A menos que tu objeto sea muy ‘pequeño’ es mejor que implementes siempre Parcelable cuando que necesites enviar un objeto entre Activities.

Cómo definir un objeto Parcelable en android

Dijimos que la mejor opción para pasar objetos entre Activities es implementar interfaz Parcelable.

Observa que en Parcelable debes definir

void writeToParcel(Parcel dest, int flags), 
int describeContents()

También establecer un constructor que reciba el Parcel y un Creator

protected Product(Parcel in) {...}
public static final Creator<Product> CREATOR = new Creator<Product>() {...}

Es importante que respetes el mismo orden de write y read. Es decir si escribiste en primer lugar el id debes leerlo tambien en primer lugar.

Mira como leer y escribir un booleano en el Parcelable.

	….
available = in.readByte() != 0;
...
 dest.writeByte((byte) (available ? 1 : 0));
...

Siempre un ejemplo es mejor.


public class Product implements Parcelable {

   private long productId;
   private String name;
   private String description;
   private boolean available;

   public Product() {
   }

   protected Product(Parcel in) {
       productId = in.readLong();
       name = in.readString();
       description = in.readString();
       available = in.readByte() != 0;
   }

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeLong(productId);
       dest.writeString(name);
       dest.writeString(description);
       dest.writeByte((byte) (available ? 1 : 0));
   }

   @Override
   public int describeContents() {
       return 0;
   }

   public static final Creator<Product> CREATOR = new Creator<Product>() {
       @Override
       public Product createFromParcel(Parcel in) {
           return new Product(in);
       }

       @Override
       public Product[] newArray(int size) {
           return new Product[size];
       }
   };

Cómo enviar un parámetro Parcelable entre Activities en android

Necesitas declarar un Intent y cargar un ‘extra data’


public class MainActivity extends AppCompatActivity {

   public static final String PRODUCT_KEY = "PRODUCT_KEY";

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

       Product product = createProduct();

       Intent intent = new Intent(this, SecondActivity.class);
       intent.putExtra(PRODUCT_KEY, product);

       startActivity(intent);

   }

   // for the purpose of this example
   private Product createProduct() {
       Product product = new Product();
       product.setProductId(123l);
       product.setName("Android");
       product.setDescription("Android Mobile");
       product.setAvailable(true);
       return product;
   }

}

Cómo recibir un parámetro Parcelable entre Activities en android

Aquí necesitas obtener el intent y leer getParcelableExtra()


public class SecondActivity extends AppCompatActivity {

   private TextView productId;
   private TextView productName;
   private TextView productDescription;
   private TextView productAvailable;

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

       initializeViews();

       Product product = getIntent().getParcelableExtra(MainActivity.PRODUCT_KEY);
       if(product != null) {
           updateTextViews(product);
       }else {
           Toast.makeText(this, "NO product to show ", Toast.LENGTH_LONG).show();
       }

   }

   private void initializeViews() {
       productId = (TextView) findViewById(R.id.productId);
       productName = (TextView) findViewById(R.id.productName);
       productDescription = (TextView) findViewById(R.id.productDescription);
       productAvailable = (TextView) findViewById(R.id.productAvailable);
   }

   private void updateTextViews(Product product) {
       productId.setText(String.valueOf(product.getProductId()));
       productName.setText(product.getName());
       productDescription.setText(product.getDescription());
       productAvailable.setText(String.valueOf(product.isAvailable()));
   }

}

Referencias
https://developer.android.com/reference/android/os/Parcelable.html
https://developer.android.com/reference/android/os/Parcel.html

Descarga este código completo

Compartir esto:

6 thoughts on “Android Como enviar parámetros entre Activities usando Parcelable

  1. ruben

    Perdon me equivoque la pregunta era para el
    post
    Android Tabs con Fragment y RecyclerView

    Reply
  2. ruben

    Muy buen post me ha servido de mucho.
    He aumentado el siguiente codigo para poder eliminar una fila haciendo click en el titleView del recycler
    holder.titleView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    dummyModels = removerFila(dummyModels,position);// dummyModels[position]=null;
    notifyItemRemoved(position);
    notifyItemRangeChanged(position, dummyModels.length);
    }
    });

    y este codigo para remover la fila del array

    private static DummyModel[] removerFila(DummyModel[] arrayObjetos, int i) {
    DummyModel[] nuevoArray = new DummyModel[arrayObjetos.length – 1];
    if (i > 0){
    System.arraycopy(arrayObjetos, 0, nuevoArray, 0, i);
    }
    if (nuevoArray.length > i){
    System.arraycopy(arrayObjetos, i + 1, nuevoArray, i, nuevoArray.length – i);
    }
    return nuevoArray;
    }

    Elimina bien las filas de los 3 tabs pero cuando regreso al tab1 y al tab3 se reponen todas las filas eliminadas como puedo hacer para que esto no suceda porq mi intencion es que se guarden las filas que ya he eliminado y no se esten reconstruyendo cualquier ayuda sera muy agradecida.

    Reply
    1. Gustavo Post author

      Hola! Estas notificando el cambio al adapter? Hecha un vistazo al método notifyDataSetChanged() del adapter. Saludos!

      Reply
      1. ruben

        Saludos, estoy suponiendo que hay que implementar en el “ItemFragment” dime si esta bien lo que estoy suponiendo

        Reply
        1. ruben

          Ya lo implemente en el intenFragment pero sigue con los mismos resultados

          Reply
          1. Gustavo Post author

            Parcelable lo implementas en tu modelo a serializar entre los activities.
            saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *