pasar objetos entre actividades android parcelable

objetos - parcelable android



Cómo hacer una clase con objetos anidados Parcelable (6)

Me gustaría hacer clase A Parcelable.

public class A { public String str; public ArrayList<B> list; }

Esto es lo que he encontrado hasta ahora. Sin embargo, se bloquea con una NullPointerException. El problema son estas dos declaraciones: dest.writeList(list); & in.readList(list, this.getClass().getClassLoader()); . No puedo averiguar qué hacer desde aquí :(

Clase A

public class A implements Parcelable { public String str; public ArrayList<B> list; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(str); dest.writeList(list); } private A(Parcel in) { str = in.readString(); in.readList(list, this.getClass().getClassLoader()); } public static final Parcelable.Creator<A> CREATOR = new Parcelable.Creator<A>() { public A createFromParcel(Parcel in) { return new A(in); } public A[] newArray(int size) { return new A[size]; } }; }

Clase B

public class B implements Parcelable { public String str; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(str); } private B(Parcel in) { str = in.readString(); } public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() { public B createFromParcel(Parcel in) { return new B(in); } public B[] newArray(int size) { return new B[size]; } }; }

Gracias por tu tiempo.


En Write to parcel

@Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(name); //if String parcel.writeTypedList(assignedEmployees); //if List with custom class, eg. List<AssignedEmployee> assignedEmployees parcel.writeParcelable(checkin,i); //if custom class, eg. Checkin checkin; }

En Constructor por leerlo de nuevo.

protected A(Parcel in) { name = in.readString(); assignedEmployees = in.createTypedArrayList(AssignedEmployee.CREATOR); checkin = in.readParcelable(Checkin.class.getClassLoader()); }

donde AssignedEmployee, Checkin donde clases personalizadas y debe implementar Parcelable.


Finalmente, me di cuenta de qué escribir en Google :), y encontré este método Android, ¿Cómo usar el método readTypedList correctamente en una clase de Parcelable?

La solución fue usar read-/writeTypedList en read-/writeTypedList lugar. También inicializo el arraylist para evitar cualquier otra excepción NullPointerException.

Clase A

public class A implements Parcelable { public String str; public ArrayList<B> list = new ArrayList<B>(); @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(str); dest.writeTypedList(list); } private A(Parcel in) { str = in.readString(); in.readTypedList(list, B.CREATOR); } public static final Parcelable.Creator<A> CREATOR = new Parcelable.Creator<A>() { public A createFromParcel(Parcel in) { return new A(in); } public A[] newArray(int size) { return new A[size]; } }; }

Clase B

public class B implements Parcelable { public String str; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(str); } private B(Parcel in) { str = in.readString(); } public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() { public B createFromParcel(Parcel in) { return new B(in); } public B[] newArray(int size) { return new B[size]; } }; }


Puede agregar el complemento generador de código parcelable desde los prefs, desde allí puede crear el código de placa de caldera parcelable haciendo lo siguiente: - haga clic derecho en el nombre de la clase dentro del modelo - seleccione generar - seleccione Parcelable

presto - su modelo se actualizará con el necesario código Parcelable repetitivo.


Si solo tiene un objeto Parcelable dentro de su objeto Parcelable principal, no enumere como el caso de respuesta aceptado. Entonces será como el siguiente:

Clase A

public class A implements Parcelable { public String str; public B objectB; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { //The parcelable object has to be the first one dest.writeParcelable(objectB, flags); dest.writeString(str); } private A(Parcel in) { this.objectB = in.readParcelable(B.class.getClassLoader()); str = in.readString(); } public static final Parcelable.Creator<A> CREATOR = new Parcelable.Creator<A>() { public A createFromParcel(Parcel in) { return new A(in); } public A[] newArray(int size) { return new A[size]; } }; }

Clase B

public class B implements Parcelable { public String str; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(str); } private B(Parcel in) { str = in.readString(); } public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() { public B createFromParcel(Parcel in) { return new B(in); } public B[] newArray(int size) { return new B[size]; } }; }

IMPORTANTE: tenga en cuenta que el orden en que escribe y lee el objeto Parcelable importante. Comprueba esta answer para más detalles.


Simplemente presione ALT + ENTRAR y reemplace Parcelable que implementará toda la implementación necesaria


Tuve el mismo problema aquí hay una versión genérica

class Item<T : Parcelable> (val model: T, val index: Int ) : Parcelable { constructor(parcel: Parcel) : this(parcel.readParcelable( Item<T>::model.javaClass.classLoader), parcel.readInt() ) {} override fun writeToParcel(parcel: Parcel?, flag: Int) { parcel?.writeParcelable(model, 0) parcel?.writeInt(index) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<Item<Parcelable>> { override fun createFromParcel(parcel: Parcel): Item<Parcelable> { return Item(parcel) } override fun newArray(size: Int): Array<Item<Parcelable>?> { return arrayOfNulls(size) } } }