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
:
- Hacer una clase parcelable que contiene la lista de objetos personalizados
- ¿Es posible distribuir una clase genérica?
- Cómo obtener ClassLoader de variable de tipo (para parcelar una clase usando genéricos)
- ¿Cómo maneja la superficie la recolección de basura después de ser parcelada en Android?
- Pase la matriz 2D a otra actividad
class B implements Parcelable{ public void writeToParcel(Parcel dest, int flags) { dest.write ??? } }
¿Cómo puedo escribirlo y leerlo?
- Error al pasar de un objeto de una actividad a otra (utilizando parcelable)
- Odd Error "Clase no encontrada al desmarcar"
- ¿Cómo leer / escribir un booleano al implementar la interfaz Parcelable?
- Parcelable donde / cuando se describeContents () usado?
- Cómo enviar objetos a través de un paquete
- Android: cómo almacenar persistentemente un Spanned?
- Hacer ArrayList de objetos personalizados parcelable
- Problema en la implementación de Parcelable conteniendo otros Parcelable
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ómo dibujar polígono lleno?
- Dispositivo que se desconecta aleatoriamente (y aparece varias veces como sin conexión) en Eclipse – arregla?