android enums parcelable parcel

¿Cómo leer y escribir Enum en parcela en Android?



enums parcelable (5)

Cualquier enum es serializable.

Puede hacer esto en writeToParcel() : dest.writeSerializable(action)

Y en el constructor: action = (Action) in.readSerializable()

Aquí está mi clase de modelo:

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]; } };


El paquete más eficiente, eficiente en memoria, se crea utilizando el valor ordinal de ENUM.

Escribiendo en Parcel dest.writeInt(enum_variable.ordinal());

Lectura de la parcela enum_variable = EnumName.values()[in.readInt()];

Esto debería estar bien a menos que no prestes atención a las advertencias de la documentación:

El paquete no es un mecanismo de serialización de propósito general. Esta clase (y la correspondiente API parcelable para colocar objetos arbitrarios en una parcela) está diseñada como un transporte IPC de alto rendimiento. Como tal, no es apropiado colocar los datos de Parcel en el almacenamiento persistente: los cambios en la implementación subyacente de cualquiera de los datos en Parcel pueden hacer que los datos más antiguos sean ilegibles.

En otras palabras, no debe pasar Parcelas entre versiones de código porque puede que no funcione.


Enumeración de enumeración:

public enum Action { NEXT(1), OK(2); private int action; Action(int action) { this.action = action; } }

Lectura del paquete:

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

Escribiendo a parcela:

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


Tuve un problema similar y mi solución fue:

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

y para la lectura:

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

QuestionType es enumeración y recuerde que el orden de los elementos es importante.


Una forma de hacer esto es escribir Acciones en entero y leerlas correctamente como entero y convertirlas en Acción. Lo que quiero decir:

@Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.imageId); dest.writeString(this.description); dest.writeString(this.actionName); int actionAsInt = action == Action.RETRY ? 1 : 0; dest.writeInt(actionAsInt); } protected NetworkError(Parcel in) { this.imageId = in.readInt(); this.description = in.readString(); this.actionName = in.readString(); int actionAsInt = in.readInt(); this.action = actionAsInt == 1 ? Action.RETRY : Action.SETTINGS; }

Intentalo. El éxito ...