Estoy tratando de hacer mis objetos Parcelable. Sin embargo, tengo objetos personalizados y esos objetos tienen ArrayList
atributos de otros objetos personalizados que he creado.
Cuál sería la mejor forma de hacer esto?
fuente
Estoy tratando de hacer mis objetos Parcelable. Sin embargo, tengo objetos personalizados y esos objetos tienen ArrayList
atributos de otros objetos personalizados que he creado.
Cuál sería la mejor forma de hacer esto?
Puede encontrar algunos ejemplos de esto aquí , aquí (el código se toma aquí) y aquí .
Puede crear una clase POJO para esto, pero necesita agregar un código adicional para hacerlo 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 objetos de esta clase a través de Intent
este tipo y recuperar este objeto en la actividad de destino.
intent.putExtra("student", new Student("1","Mike","6"));
Aquí, el alumno es la clave que necesitaría para desempaquetar los datos del paquete.
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");
Este ejemplo muestra solo String
tipos. Pero, puede parcelar cualquier tipo de datos que desee. Pruébalo.
EDITAR: Otro ejemplo , sugerido por Rukmal Dias .
writeToParcel
método?Aquí hay un sitio web para crear una Clase Parcelable a partir de su clase creada:
http://www.parcelabler.com/
fuente
IntelliJ IDEA y Android Studio tienen complementos para esto:
Estos complementos generan código repetitivo parcelable de Android basado en los campos de la clase.
fuente
1. Importar
Android Parcelable code generator
2. Crea una clase
3. Generar> Parcelable desde el menú
Hecho.
fuente
File > Settings... > Plugins
y haga clic en elBrowse repositories...
botón.¿Cómo? Con anotaciones.
Simplemente anota un POJO con una anotación especial y la biblioteca hace el resto.
Pros:
Contras:
Hrisey
Hrisey está basado en Lombok . Clase parcelable usando Hrisey :
Ahora no necesita implementar ningún método de interfaz Parcelable. Hrisey generará todo el código requerido durante la fase de preprocesamiento.
Hrisey en las dependencias de Gradle:
Consulte aquí los tipos compatibles. 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 recibirá un error durante el inicio de IDE.
Parceler
Clase parcelable usando Parceler :
Para usar el código generado, puede hacer referencia a la clase generada directamente o mediante la
Parcels
clase de utilidad utilizandoPara desreferenciar
@Parcel
, simplemente llame al siguiente método deParcels
claseParceler en dependencias de Gradle:
Busque en README los tipos de atributos admitidos .
AutoParcel
AutoParcel es una extensión de AutoValue que permite la generación de valores parcelables.
Simplemente agregue
implements Parcelable
a sus@AutoValue
modelos anotados:AutoParcel en el archivo de compilación de Gradle:
PaperParcel
PaperParcel es un procesador de anotaciones que genera automáticamente código repetitivo parcelable seguro para Kotlin y Java. PaperParcel admite clases de datos de Kotlin, AutoValue de Google a través de una extensión de AutoValue o simplemente objetos Java Bean normales.
Ejemplo de uso de documentos .
Anote su clase de datos con
@PaperParcel
, implementePaperParcelable
y agregue una instancia estática de JVM, porPaperParcelable.Creator
ejemplo: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 de habla inglesa-china son bienvenidas)
Ejemplo de uso de README .
El complemento android-apt ayuda a trabajar con procesadores de anotaciones en combinación con Android Studio.
fuente
He encontrado la forma más sencilla de crear la clase Parcelable
fuente
Es muy fácil, puede usar un complemento en Android Studio para hacer objetos Parcelables.
fuente
Ahora puede usar la biblioteca Parceler para convertir cualquier clase personalizada en parcelable. Simplemente anote su clase POJO con @Parcel . p.ej
puede crear un objeto de clase Ejemplo y envolver paquetes y enviarlos como un paquete a través de la intención. p.ej
Ahora para obtener un objeto de clase personalizada solo use
fuente
Android parcable tiene algunas cosas únicas. Esos se dan a continuación:
Ejemplo: para hacer una clase Parceble, debe implementar Parceble. Percable tiene 2 métodos:
Supongamos que tiene una clase Persona y tiene 3 campos, nombre, apellido y edad. Después de implementar la interfaz Parceble. esta interfaz se muestra a continuación:
Aquí
writeToParcel
método estamos escribiendo / agregando datos en Parcel en un pedido. Después de esto, debemos agregar el siguiente código para leer los datos del paquete:Aquí, la clase Persona toma un paquete y obtiene datos en el mismo orden durante la escritura.
Ahora durante la intención
getExtra
y elputExtra
código se da a continuación:Poner en Extra :
Obtenga extra:
La clase de persona completa se da a continuación :
fuente
Crear clase Parcelable sin complemento en Android Studio
implementa Parcelable en su clase y luego coloca el cursor en "Implementa Parcelable" y presiona
Alt+Enter
y seleccionaAdd Parcelable implementation
(ver imagen). Eso es.fuente
Poner:
bundle.putSerializable("key",(Serializable) object);
Llegar:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));
fuente
ClassCastException
si el objeto no se implementaSerializable
.