studio parcelabler intent example describecontents android parcelable

android - intent - parcelabler



¿Cómo puedo hacer mis objetos personalizados Parcelable? (9)

¿Cómo? Con anotaciones.

Simplemente anote un POJO con una anotación especial y la biblioteca hará el resto.

¡Advertencia!

No estoy seguro de que Hrisey, Lombok y otras bibliotecas de generación de código sean compatibles con el nuevo sistema de compilación de Android. Pueden o no jugar bien con el código de intercambio en caliente (es decir, jRebel, Instant Run).

Pros:

  • Las bibliotecas de generación de código te salvan del código fuente de boilerplate.
  • Las anotaciones hacen que tu clase sea hermosa.

Contras:

  • Funciona bien para clases simples. Hacer una clase compleja parcelable puede ser complicado.
  • Lombok y AspectJ no juegan bien juntos. [details]
  • Ver mis advertencias

Hrisey

¡Advertencia!

Hrisey tiene un problema conocido con Java 8 y, por lo tanto, no se puede utilizar para el desarrollo de Android en la actualidad. Consulte # 1 No se pueden encontrar errores de símbolo (JDK 8) .

Hrisey se basa en Lombok . Clase parcelable usando Hrisey :

@hrisey.Parcelable public final class POJOClass implements android.os.Parcelable { /* Fields, accessors, default constructor */ }

Ahora no es necesario implementar ningún método de interfaz Parcelable. Hrisey generará todo el código requerido durante la fase de preprocesamiento.

Hrisey en dependencias de Gradle:

provided "pl.mg6.hrisey:hrisey:${hrisey.version}"

Vea aquí para los tipos soportados. El ArrayList está entre ellos.

Instale un complemento - Hrisey xor Lombok * - para su IDE y comience a usar sus increíbles funciones.


* No habilite los complementos de Hrisey y Lombok juntos o obtendrá un error durante el lanzamiento del IDE.

Parcelador

Clase parcelable utilizando Parceler :

@java.org.parceler.Parcel public class POJOClass { /* Fields, accessors, default constructor */ }

Para usar el código generado, puede hacer referencia a la clase generada directamente, oa través de la clase de utilidad Parcels usando

public static <T> Parcelable wrap(T input);

Para @Parcel la referencia a @Parcel , simplemente llame al siguiente método de la clase Parcels

public static <T> T unwrap(Parcelable input);

Parceler en dependencias Gradle:

compile "org.parceler:parceler-api:${parceler.version}" provided "org.parceler:parceler:${parceler.version}"

Busque en Parceler tipos de atributos soportados.

AutoParcel

AutoParcel es una extensión de AutoValue que permite la generación de valores Parcelable.

Solo agregue implements Parcelable a sus modelos anotados @AutoValue :

@AutoValue abstract class POJOClass implements Parcelable { /* Note that the class is abstract */ /* Abstract fields, abstract accessors */ static POJOClass create(/*abstract fields*/) { return new AutoValue_POJOClass(/*abstract fields*/); } }

AutoParcel en el archivo de compilación de Gradle:

apply plugin: ''com.android.application'' apply plugin: ''com.neenbedankt.android-apt'' repositories { /*...*/ maven {url "https://clojars.org/repo/"} } dependencies { apt "frankiesardo:auto-parcel:${autoparcel.version}" }

PaperParcel

PaperParcel es un procesador de anotación que genera automáticamente el código de placa de caldera parcelable de tipo seguro para Kotlin y Java. PaperParcel es compatible con Kotlin Data Classes, AutoValue de Google a través de una extensión de AutoValue, o simplemente objetos regulares de Java Beans.

Ejemplo de uso de docs .
Anote su clase de datos con @PaperParcel , implemente PaperParcelable , y agregue una instancia estática JVM de PaperParcelable.Creator por ejemplo:

@PaperParcel public final class Example extends PaperParcelable { public static final PaperParcelable.Creator<Example> CREATOR = new PaperParcelable.Creator<>(Example.class); private final int test; public Example(int test) { this.test = test; } public int getTest() { return test; } }

Para usuarios de Kotlin, vea Uso de Kotlin ; Para usuarios de AutoValue, consulte Uso de AutoValue .

Generador Parcelable

ParcelableGenerator (README está escrito en chino y no lo entiendo. Las contribuciones a esta respuesta de desarrolladores que hablan inglés y chino son bienvenidas)

Ejemplo de uso de README .

import com.baoyz.pg.Parcelable; @Parcelable public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

El complemento de android-apt ayuda a trabajar con procesadores de anotación en combinación con Android Studio.

Estoy tratando de hacer mis objetos Parcelable. Sin embargo, tengo objetos personalizados y esos objetos tienen atributos ArrayList de otros objetos personalizados que he creado.

Cuál sería la mejor forma de hacer esto?


1. Importar Android Parcelable code generator

2. Crea una clase

public class Sample { int id; String name; }

3. Generar> Parcelable desde el menú

Hecho.


Ahora puede usar la biblioteca de Parceler para convertir cualquier clase personalizada en parcelable. Simplemente anota tu clase de POJO con @Parcel . p.ej

@Parcel public class Example { String name; int id; public Example() {} public Example(int id, String name) { this.id = id; this.name = name; } public String getName() { return name; } public int getId() { return id; } }

puede crear un objeto de clase de ejemplo y envolver a través de parcelas y enviarlo como un paquete a través de la intención. p.ej

Bundle bundle = new Bundle(); bundle.putParcelable("example", Parcels.wrap(example));

Ahora para obtener el objeto Custom Class solo usa

Example example = Parcels.unwrap(getIntent().getParcelableExtra("example"));



Es muy fácil, puedes usar un plugin en Android Studio para hacer objetos Parcelables.

public class Persona implements Parcelable { String nombre; int edad; Date fechaNacimiento; public Persona(String nombre, int edad, Date fechaNacimiento) { this.nombre = nombre; this.edad = edad; this.fechaNacimiento = fechaNacimiento; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.nombre); dest.writeInt(this.edad); dest.writeLong(fechaNacimiento != null ? fechaNacimiento.getTime() : -1); } protected Persona(Parcel in) { this.nombre = in.readString(); this.edad = in.readInt(); long tmpFechaNacimiento = in.readLong(); this.fechaNacimiento = tmpFechaNacimiento == -1 ? null : new Date(tmpFechaNacimiento); } public static final Parcelable.Creator<Persona> CREATOR = new Parcelable.Creator<Persona>() { public Persona createFromParcel(Parcel source) { return new Persona(source); } public Persona[] newArray(int size) { return new Persona[size]; } };}


He encontrado la forma más sencilla de crear la clase Parcelable


Para poner: bundle.putSerializable("key",(Serializable) object);

Para obtener: List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));


Puede encontrar algunos ejemplos de esto here , aquí (el código se toma aquí) , y here .

Puede crear una clase POJO para esto, pero necesita agregar un código adicional para que sea parcelable. Echa un vistazo a la implementación.

public class Student implements Parcelable{ private String id; private String name; private String grade; // Constructor public Student(String id, String name, String grade){ this.id = id; this.name = name; this.grade = grade; } // Getter and setter methods ......... ......... // Parcelling part public Student(Parcel in){ String[] data = new String[3]; in.readStringArray(data); // the order needs to be the same as in writeToParcel() method this.id = data[0]; this.name = data[1]; this.grade = data[2]; } @Оverride public int describeContents(){ return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeStringArray(new String[] {this.id, this.name, this.grade}); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Student createFromParcel(Parcel in) { return new Student(in); } public Student[] newArray(int size) { return new Student[size]; } }; }

Una vez que haya creado esta clase, puede pasar fácilmente los objetos de esta clase a través del Intento como este y recuperar este objeto en la actividad objetivo.

intent.putExtra("student", new Student("1","Mike","6"));

Aquí, el estudiante es la clave que necesitaría para desmarcar los datos del paquete.

Bundle data = getIntent().getExtras(); Student student = (Student) data.getParcelable("student");

Este ejemplo muestra solo tipos de cadena. Pero, puede parcelar cualquier tipo de datos que desee. Pruébalo.

EDIT: Otro example , sugerido por Rukmal Dias.