2011-11-18 15 views
14

Voglio passare l'oggetto tra due attività in Android che mi ha portato a classi parcelable. Non sto cercando di convertire la mia classe corrente ma non capisco il metodo Parcelable.Creator.Android: Rendere una classe parcellabile

Questo è ciò che ho finora

public class Account implements Parcelable{ 

/** 
* Declare private variables 
*/ 

private String fName; 
private String lName; 
private String screenName; 
private String email; 
private String level; 
private int userId; 
//private Context myContext; 

/** 
* Account constructor 
*/ 

public Account(String fName, String lName, String sName, String email, String level, String x) throws Exception{  


    /**Parse userId into int */ 
    this.userId = Integer.parseInt(x); 

    /**Select from DB user details */ 


    /**Initialize variables with results */ 
    this.setfName(fName); 
    this.setlName(lName); 
    this.setScreenName(sName); 
    this.setEmail(email); 
    this.setLevel(level); 



} 

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

@Override 
public void writeToParcel(Parcel out, int flags) { 
    // TODO Auto-generated method stub 
    out.writeString(fName); 
    out.writeString(lName); 
    out.writeString(screenName); 
    out.writeString(email); 
    out.writeString(level); 
    out.writeInt(userId); 

} 

// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods 
public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() { 
    public Account createFromParcel(Parcel in) { 
     return new Account(in); 
    } 

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



/** 
* Getters and setters for all variables from Account class 
*/ 

public int getUserId(){ 
    return userId; 
} 

public String getScreenName() { 
    return screenName; 
} 

public void setScreenName(String screenName) { 
    this.screenName = screenName; 
} 

public String getfName() { 
    return fName; 
} 

public void setfName(String fName) { 
    this.fName = fName; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getLevel() { 
    return level; 
} 

public void setLevel(String level) { 
    this.level = level; 
} 

public String getlName() { 
    return lName; 
} 

public void setlName(String lName) { 
    this.lName = lName; 
} 



} 

Grazie in anticipo.

risposta

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

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

Questo campo è necessario affinché Android sia in grado di creare nuovi oggetti, singolarmente o come array. Ciò significa anche che è possibile utilizzare la funzione di costruzione predefinita per creare l'oggetto e utilizzare un altro metodo per renderlo iridabile, se necessario.

Guardate questa Android – Parcelable

Online tool for creating Parcelable class

e http://www.appance.com/tag/parcelable/

+2

"Questo campo è necessario per consentire a Android di creare nuovi oggetti" - ma * quando *? –

18

Qui è un grande strumento per Android implementazioni Parcelable.

Parcelabler by Dallas Gutauckis

+1

Questo strumento è davvero utile. Stavo trovando questo tipo di strumento.Grazie per aver condiviso questo con noi. –

+0

@AndreyPetrov È ora. – Sufian

+1

la pagina non è più valida –

0

On GitHub si possono trovare un po 'di codice che ho scritto qualche tempo fa per semplificare la gestione dei parcelables (ad esempio, scrivendo a e leggere dai pacchi, semplificando il codice di inizializzazione per CREATORs).

scrittura su un pacco:

parcelValues(dest, name, maxSpeed, weight, wheels, color, isDriving); 

dove il colore è un enum e isDriving è un valore booleano, per esempio.

Leggendo da un pacco:

// [...] 
color = (CarColor)unparcelValue(CarColor.class.getClassLoader()); 
isDriving = (Boolean)unparcelValue(); 

Creazione di un creatore per le classi:

public static final Parcelable.Creator<Car> CREATOR = 
    Parceldroid.getCreatorForClass(Car.class); 

... o per enumerazioni:

public static final Parcelable.Creator<CarColor> CREATOR = 
    Parceldroid.getCreatorForEnum(CarColor.class); 

Basta dare uno sguardo al " ParceldroidExample "Ho aggiunto al progetto.

0

Il trasferimento dei dati tra le attività può essere eseguito utilizzando sia serializzabile che Parcelable. Ma parcelable è considerato il migliore. (why)

C'è un plugin in Android che consente di inserire codice parcelable per i campi della classe. Puoi trovarlo dal menu File> Impostazioni> Plugin> Generatore di codici parcelable Android.

E utilizzare la scorciatoia alt + inserire proprio come getter e setter per utilizzare il plugin.

Problemi correlati