Escribir una subclase de Parcelable a otra parcela

Tengo una clase que implementa interfaz Parcelable :

 class A implements Parcelable { } 

Tengo otra clase B que contiene un objeto A como una variable de instancia. En el writeToPacel dentro de la clase B , quiero escribir el objeto B en el Parcel :

 class B implements Parcelable{ public void writeToParcel(Parcel dest, int flags) { dest.write ??? } } 

¿Cómo puedo escribirlo y leerlo?

 class B implements Parcelable{ //lets assume you have A as a data member A obj; public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(obj , flags); } } 

Si quieres leerlo usa esto

  obj = in.readParcelable(A.class.getClassLoader()); 

Una mejor manera de manejar esto que evita la reflexión sería simplemente llamar al creador estático en el tipo de destino como esto:

 this.amazingObject = AmazingObject.CREATOR.createFromParcel(in); 

Y escribirlo en el Parcelable usando this.amazingObject.writeToParcel(Parcel, int)

Internamente, al llamar a readParcelable(ClassLoader) esto sucede:

 public final <T extends Parcelable> T readParcelable(ClassLoader loader) { Parcelable.Creator<T> creator = readParcelableCreator(loader); if (creator == null) { return null; } if (creator instanceof Parcelable.ClassLoaderCreator<?>) { return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader); } return creator.createFromParcel(this); } 

Como se puede ver la última llamada de ese método es simplemente llamar al Creator derecho, pero dentro de readParcelableCreator hay un montón de reflexión que podemos evitar llamando directamente.

Estas llamadas de utilidad pueden ser útiles:

 import android.os.Parcel; import android.os.Parcelable; public class Parcels { public static void writeBoolean(Parcel dest, Boolean value) { dest.writeByte((byte) (value != null && value ? 1 : 0)); } public static Boolean readBoolean(Parcel in){ return in.readByte() != 0; } public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) { writeBoolean(dest, parcelable == null); if (parcelable != null) { parcelable.writeToParcel(dest, flags); } } public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) { boolean isNull = readBoolean(in); return isNull ? null : creator.createFromParcel(in); } } 

La línea:

 obj = (A)in.readParcelable(A.class.getClassLoader()); 

Debe cambiar a:

 obj = (A)in.readParcelable(B.class.getClassLoader()); 

Encontré el mismo problema y hice varias búsquedas de Google, muchas páginas web o tutoriales sugieren que usamos A.class.getClassLoader() porque estamos emitiendo a A, pero en realidad es INCORRECTO porque obtendrás un valor nulo, debemos usar B.class.getClassLoader() porque los codes are INSIDE class B Simplemente no sabía por qué pero puede obtener el objeto A correcto de esta manera.

Bienvenido a comentar y verificar !!

  • Código de tipo desconocido del paquete
  • Cómo pasar una matriz de objetos de dirección a otra Acitvity
  • No se puede implementar Parcelable porque no puedo hacer que el campo CREATOR esté estático
  • Escribir enum con String a paquete
  • Cómo implementar Parcelable para una clase que contenga List <List <String>?
  • Implementación de clase parcelable que requiere contexto
  • ¿Por qué utilizar parcelable cuando se puede realizar la misma tarea utilizando variables estáticas?
  • Fragmentos de Android que conservan datos
  • NullPointerException intentando leer Parcel String
  • Android | Unmarshalling Tipo desconocido al utilizar datos parcelables en paquetes
  • Herencia parcelable: clase abstracta - ¿QUÉ CREADOR?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.