Estoy tratando de hacer ArrayList
Parcelable
una lista de objetos personalizados para pasar a una actividad. Empiezo a escribir una myObjectList
clase que se extiende ArrayList<myObject>
e implementa Parcelable
.
Algunos atributos de MyObject
son boolean
pero Parcel
no tienen ningún método read/writeBoolean
.
¿Cuál es la mejor manera de manejar esto?
android
parcelable
grunk
fuente
fuente
Serializable
interfaz 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
writeBooleanArray
yreadBooleanArray
Si 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
Creará automáticamente Parcelable.
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
Parcelable
interfaz.Deberá almacenar el valor como una cadena o como un byte. Si elige una cadena, deberá usar el método estático de la
String
clase 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
Parcel
objeto, 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() != 0
Esta 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
PackageInfo
clase tiene un miembro booleanorequiredForAllUsers
y se serializa de la siguiente manera:fuente