Translate

samedi 4 mai 2013

Parcelable : Comment passer/communiquer un objet d'une classe à une autre

Sous Android, il est possible de faire passer des données d'une Activité à une autre en utilisant :


Intent intent = new Intent(this, ClassB.class);
intent.putExtra(Key, VALUE);
startActivity(intent);

Cependant VALUE peut être int, String, Boolean... mais ne peut être un objet.

Un moyen simple pour rendre possible la communication d'objets entre les Activités est d'implémenter, au niveau de la classe de l'objet, l'interface Parcelable

public class ParcelableObject implements Parcelable

Ajouter un constructeur prenant comme paramètre un Parcel

public ParcelableObject(Parcel in) {        

nom = in.readString();
prenom = in.readString();
mail = in.readString();
boolean droits[] = new boolean[1];
in.readBooleanArray(droits);
estEtudiant = droits[0];
age = in.readInt();

}

Ajouter une méthode qui va écrire l'objet en Parcel
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(nom);
dest.writeString(prenom);
dest.writeString(mail);
boolean droits[] = { estEtudiant };//Pour les boulean on ne peut passer qu'un BooleanArray
dest.writeBooleanArray(droits);
dest.writeInt(age);
}

Remarque très importante : L'ordre d'écriture dans le Parcel doit être le même au niveau de la lecture. Dans notre cas nom -> prenom -> mail -> estEtudiant ->age

Et enfin créer un Parcelable.Creator

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

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

 Au niveau de l'ActivitéA nous aurons :

ParcelableObject object = new ParcelableObject("Farouk", "f.ferjani.farouk@gmail.com", "FERJANI", false, 24);
Intent intent = new Intent(this, ClassB.class);
intent.putExtra(Key, object);
startActivity(intent);

 Au niveau de l'ActivitéB nous aurons :


Bundle extras = getIntent().getExtras();
if (extras != null) {
    ParcelableObject doc = extras.getParcelable(Key);
}
            
  Codecomplet de la classe ParcelableObject 

package com.example.tutoparcelable;

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

/**
 * Document.
 *
 * @author Farouk
 *
 */
public class ParcelableObject implements Parcelable {
       private String nom = null;
       private String prenom = null;
       private String mail = null;
       private int age;
       private boolean estEtudiant;

       public ParcelableObject(final String prenom, final String mail,
                    final String nom, final boolean estEtudiant, final int age) {
             this.prenom = prenom;
             this.nom = nom;
             this.mail = mail;
             this.age = age;
             this.estEtudiant = estEtudiant;
       }

       public ParcelableObject(Parcel in) {
             readFromParcel(in);
       }

       public final String getNom() {
             return nom;
       }

       public final String getPrenom() {
             return prenom;
       }

       public final String getMail() {
             return mail;
       }

       public final int getAge() {
             return age;
       }

       public final boolean isEtudiant() {
             return estEtudiant;
       }

       @Override
       public void writeToParcel(Parcel dest, int flags) {
             dest.writeString(nom);
             dest.writeString(prenom);
             dest.writeString(mail);
             boolean droits[] = { estEtudiant };//Pour les boulean on ne peut passer qu'un BooleanArray
             dest.writeBooleanArray(droits);
             dest.writeInt(age);
       }

       private void readFromParcel(Parcel in) {
             nom = in.readString();
             prenom = in.readString();
             mail = in.readString();
             boolean droits[] = new boolean[1];
             in.readBooleanArray(droits);
             estEtudiant = droits[0];
             age = in.readInt();
       }

       @SuppressWarnings("rawtypes")
       public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
             public ParcelableObject createFromParcel(Parcel in) {
                    return new ParcelableObject(in);
             }

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

       @Override
       public int describeContents() {
             // TODO Auto-generated method stub
             return 0;
       }
}