Estoy tratando de hacer ArrayList Parcelableuna lista de objetos personalizados para pasar a una actividad. Empiezo a escribir una myObjectListclase que se extiende ArrayList<myObject>e implementa Parcelable.
Algunos atributos de MyObjectson booleanpero Parcelno tienen ningún método read/writeBoolean.
¿Cuál es la mejor manera de manejar esto?
android
parcelable
grunk
fuente
fuente

Serializableinterfaz para la comunicación entre actividades. Es lento.Respuestas:
Así es como lo haría ...
writeToParcel:
readFromParcel:
fuente
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }writeByte, pero en realidad escribe un int.También puede hacer uso del método writeValue . En mi opinión, esa es la solución más sencilla.
Luego, puede recuperarlo fácilmente con un elenco simple para
Boolean:Bajo el capó, Android Framework lo manejará como un número entero:
fuente
declaras así
escribir
leer
El tipo booleano debe convertirse en algo que Parcel admita y para que podamos convertirlo a int.
fuente
AndroidStudio (usando 2.3 atm), después de implementar Parcelable en su clase, simplemente puede mantener el puntero del mouse sobre el nombre de su clase y le pide que agregue la implementación parcelable:
A partir de los cuatro campos, genera lo siguiente:
fuente
Normalmente los tengo en una matriz y llamo
writeBooleanArrayyreadBooleanArraySi es un booleano único que necesita empacar, puede hacer esto:
fuente
fuente
Simplemente vaya a Archivo-> Configuración-> Complementos-> Examinar repositorio y busque parcelable. Ver imagen
Y hay un sitio web también para hacer esto. http://www.parcelabler.com/
fuente
Implementación corta y simple en Kotlin , con soporte anulable:
Agregar métodos a la parcela
Y úsalo:
fuente
Puede empaquetar sus valores booleanos en un byte utilizando enmascaramiento y desplazamiento. Esa sería la forma más eficiente de hacerlo y probablemente sea lo que esperarían que hicieras.
fuente
writeByte()método llama directawriteInt()Es difícil identificar la verdadera pregunta aquí. Supongo que es cómo lidiar con los booleanos al implementar la
Parcelableinterfaz.Deberá almacenar el valor como una cadena o como un byte. Si elige una cadena, deberá usar el método estático de la
Stringclase llamadavalueOf()para analizar el valor booleano. No es tan efectivo como guardarlo en un byte difícil.Si elige un byte, deberá implementar una lógica de conversión usted mismo.
Al desarmar el
Parcelobjeto, debe hacerse cargo de la conversión al tipo original.fuente
writeByte()método Parcel llama directamentewriteInt(). La lógica de conversión es demasiado detallada. Just dowriteInt(boolean ? 1 : 0)andboolean = readInt() != 0Esta pregunta ya ha sido respondida perfectamente por otras personas, si quieres hacerlo por tu cuenta.
Si prefiere encapsular u ocultar la mayor parte del código de parcelación de bajo nivel, puede considerar usar parte del código que escribí hace algún tiempo para simplificar el manejo de las parcelables.
Escribir en un paquete es tan fácil como:
donde color es una enumeración e isDriving es un booleano, por ejemplo.
Leer desde un paquete tampoco es mucho más difícil:
Solo eche un vistazo al "ParceldroidExample" que agregué al proyecto.
Finalmente, también mantiene el inicializador CREATOR corto:
fuente
.class.getClassLoader().Hay muchos ejemplos en las fuentes de Android (AOSP). Por ejemplo, la
PackageInfoclase tiene un miembro booleanorequiredForAllUsersy se serializa de la siguiente manera:fuente