2012-04-16 5 views
3

J'ai dû transmettre un objet de données d'une activité à une autre. La meilleure façon de faire est Parcelable. L'objet de données contenait des champs avec des méthodes setter et getter. Après avoir défini certains champs et passé l'objet à une autre activité, nous observons que les valeurs des champs sont échangées avec d'autres valeurs de champ. L'ordre des champs pour l'écriture dans le colis et la lecture de la parcelle est le même.Numéro de série Android

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(id); 
    out.writeString(appNo); 
    out.writeString(this.policyNo); 
    out.writeInt((int)this.AppRcptDt.getTime()); 
    out.writeString(this.currentStatus); 
    out.writeString(this.productCd); 
    out.writeDouble(this.sumAssured); 
    out.writeDouble(this.modalPremium); 
    out.writeDouble(this.annualPremium); 
    out.writeString(this.paymentMode); 
    out.writeString(this.branchCd); 
    out.writeString(this.branchName); 
    out.writeString(this.insuredName); 
    out.writeString(this.auraStatus); 
    out.writeString(this.ownerName); 
    out.writeString(this.agentCd); 
    out.writeString(this.billingMode); 
} 

private ApplicationTrackerDO(Parcel in) { 
    id=in.readInt(); 
    this.appNo = in.readString(); 
    this.policyNo = in.readString(); 
    this.AppRcptDt = new Date(in.readLong()); 
    this.currentStatus = in.readString(); 
    this.productCd = in.readString(); 
    this.sumAssured = in.readDouble(); 
    this.modalPremium = in.readDouble(); 
    this.annualPremium = in.readDouble(); 
    this.paymentMode = in.readString(); 
    this.branchCd = in.readString(); 
    this.branchName = in.readString(); 
    this.insuredName = in.readString(); 
    this.auraStatus = in.readString(); 
    this.ownerName = in.readString(); 
    this.agentCd = in.readString(); 
    this.billingMode = in.readString(); 
} 

difference in field values

Répondre

10

Il n'est pas l'ordre mais le type de données qui ne sont pas les mêmes, à partir des 4 premières lignes que vous écrivez int, string, string, int vous lisez int, string, string, longue. Je n'ai pas vérifié plus loin, vous devez correspondre à la fois à l'ordre et au type de données des opérations de lecture et d'écriture.

+0

Merci, il a résolu le problème * pouces vers le haut * –

+0

Np :), marque s'il vous plaît comme la bonne réponse si oui. – MahdeTo

1

Vous écrivez int

out.writeInt((int)this.AppRcptDt.getTime()); 

Mais la lecture longue

this.AppRcptDt = new Date(in.readLong()); 
+0

cela échouera si this.AppRcptDt est null. – Mario

+0

bien sûr AppRcptDt ne devrait pas être nul avant d'utiliser :) – waqaslam

+0

J'ai eu un problème lorsque ma variable de date doit être nulle pour identifier qu'elle n'est pas définie (comme un anniversaire) – Mario

0

ma solution pour fournir un objet de jour avec null

@Override 
    public void writeToParcel (Parcel dest, int flags) { 
     dest.writeInt((birthday != null) ? 1 : 0); // is birthday set? 
     dest.writeLong((birthday != null) ? birthday.getTime() : 0); 
    } 

    public void readFromParcel (Parcel in) { 
     if(in.readInt() == 1) { 
      birthday = new Date(in.readLong()); 
     } else { 
      in.readLong(); // ignore stored value 
      birthday = null; 
     } 
    } 
0

java.util.Date implémente Serializab le:

public class Date implements Serializable, Cloneable, Comparable<Date> { 

    private static final long serialVersionUID = 7523967970034938905L; 

    // Used by parse() 
    private static final int CREATION_YEAR = new Date().getYear(); 

    private transient long milliseconds; 


Utilisation:

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeSerializable(myDateField); 
} 
private MyClass(Parcel in) { 
    myDateField = (Date)in.readSerializable(); 
}