2016-07-03 11 views
10

Hier ist meine Modellklasse:Wie lesen und schreiben Sie Enum in Parcel auf Android?

public enum Action { 
    RETRY, SETTINGS 
} 

private int imageId; 
private String description; 
private String actionName; 
private Action action; 

public NetworkError(int imageId, String description, String actionName, Action action) { 
    this.imageId = imageId; 
    this.description = description; 
    this.actionName = actionName; 
    this.action = action; 
} 

public int getImageId() { 
    return imageId; 
} 

public void setImageId(int imageId) { 
    this.imageId = imageId; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public String getActionName() { 
    return actionName; 
} 

public void setActionName(String actionName) { 
    this.actionName = actionName; 
} 


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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(this.imageId); 
    dest.writeString(this.description); 
    dest.writeString(this.actionName); 
} 

protected NetworkError(Parcel in) { 
    this.imageId = in.readInt(); 
    this.description = in.readString(); 
    this.actionName = in.readString(); 
} 

public static final Parcelable.Creator<NetworkError> CREATOR = new Parcelable.Creator<NetworkError>() { 
    @Override 
    public NetworkError createFromParcel(Parcel source) { 
     return new NetworkError(source); 
    } 

    @Override 
    public NetworkError[] newArray(int size) { 
     return new NetworkError[size]; 
    } 
}; 
+3

Aufzählungen sind 'Serializable'. – CommonsWare

+1

http://www.parcelabler.com/ – tachyonflux

+0

haben Sie versucht, 'dest.writeValue()' – EpicPandaForce

Antwort

25

ich ähnliches Problem und meine Lösung war hatte:

parcel.writeString(this.questionType.name()); 

und zum Lesen:

this.questionType = QuestionType.valueOf(parcel.readString()); 

QuestionType ist Enum und denken Sie daran, dass eine Bestellung von Elemente sind wichtig.

2

Enum decleration:

public enum Action { 

    NEXT(1), 
    OK(2); 

    private int action; 

    Action(int action) { 
     this.action = action; 
    } 

} 

von Parcel Lesen:

protected ActionParcel(Parcel in) { 
    int actionTmp = in.readInt(); 
    action = Tutorials.Action.values()[actionTmp]; 
} 

zu Paket Schreiben:

public void writeToParcel(Parcel dest, int flags) { 
    int actionTmp = action == null ? -1 : action.ordinal(); 
    dest.writeInt(actionTmp); 
} 
4

Jede enum ist serializable.

Sie können dies in writeToParcel(): dest.writeSerializable(action)

Und im Konstruktor: action = (Action) in.readSerializable()

+1

Dies ist die einfachste Lösung zu implementieren, aber unter Berücksichtigung 'serializable' Schnittstelle ist viel langsamer als' parcelable', ich frage mich, ob dies irgendwelche hat Effekt auf die Leistung im Vergleich zu den Antworten unten, wo Sie die 'enum' auf einen primitiveren Typ umwandeln. – mcy

0

Der effizienteste - Speicher effizient - Bündel wird durch Verwendung des ENUM Ordinalwertes erstellt.

dest.writeInt(enum_variable.ordinal());

zum Paket Schreiben von Paketlese enum_variable = EnumName.values()[in.readInt()];

Dies sollte in Ordnung sein, wenn Sie nicht die Ermahnungen der Dokumentation zu beachten:

Paket ist kein Allzweck Serialisierungsmechanismus. Diese Klasse (und die entsprechende Parcelable-API zum Platzieren beliebiger Objekte in einem Paket) ist als Hochleistungs-IPC-Transport ausgelegt. Daher ist es nicht sinnvoll, Parcel-Daten in den persistenten Speicher zu legen: Änderungen in der zugrunde liegenden Implementierung der Daten im Parcel können ältere Daten unlesbar machen.

Mit anderen Worten, Sie sollten Parcels zwischen den Code-Versionen nicht weitergeben, da es möglicherweise nicht funktioniert.

Verwandte Themen