2012-04-09 19 views
13

Tengo una clase donde tengo un Drawable como miembro.
Esta clase la utilizo para enviar datos a través de actividades como Parcelable extra.Cómo pasar Drawable usando Parcelable

Para eso he extendido el parceble, e implementado las funciones requeridas.

Puedo enviar los tipos de datos básicos usando leer/escribir int/cadena.
Pero estoy enfrentando un problema al ordenar el objeto Drawable.

Para eso intenté convertir el Drawable en byte array, pero recibo excepciones de cast de clase.

Estoy utilizando el código siguiente para convertir mi Disponibles a matriz de bytes:

Bitmap bitmap = (Bitmap)((BitmapDrawable) mMyDrawable).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[]byteArray = stream.toByteArray(); 
out.writeInt(byteArray.length); 
out.writeByteArray(byteArray); 

Y para convertir la matriz de bytes a DRAWABLE estoy usando siguiente código:

final int contentBytesLen = in.readInt(); 
byte[] contentBytes = new byte[contentBytesLen]; 
in.readByteArray(contentBytes); 
mMyDrawable = new BitmapDrawable(BitmapFactory.decodeByteArray(contentBytes, 0, contentBytes.length)); 

Cuando corro esto me sale Excepción de lanzamiento de clase

¿Cómo podemos escribir/pasar Drawable usando el HashMap?
¿Hay alguna manera por la cual podamos pasar Drawable in Parcel.

Gracias.

Respuesta

25

Como ya convierte Drawable to Bitmap en su código, ¿por qué no utilizar Bitmap como miembro de su clase Parcelable.

implementos Parcelable de forma predeterminada en la API, mediante el uso de mapa de bits, no necesita hacer nada especial en su código y será manejado automáticamente por Parcel.

O si usted insiste para utilizar Disponibles, poner en práctica sus parcelable como algo parecido a esto:

public void writeToParcel(Parcel out, int flags) { 
    ... ... 
    // Convert Drawable to Bitmap first: 
    Bitmap bitmap = (Bitmap)((BitmapDrawable) mMyDrawable).getBitmap(); 
    // Serialize bitmap as Parcelable: 
    out.writeParcelable(bitmap, flags); 
    ... ... 
} 

private Guide(Parcel in) { 
    ... ... 
    // Deserialize Parcelable and cast to Bitmap first: 
    Bitmap bitmap = (Bitmap)in.readParcelable(getClass().getClassLoader()); 
    // Convert Bitmap to Drawable: 
    mMyDrawable = new BitmapDrawable(bitmap); 
    ... ... 
} 

Espero que esto ayude.

+0

Entonces, por ejemplo, si tengo un objeto con un mapa de bits y otros tipos, ¿no tengo que escribir la imagen en el paquete? y va a funcionar todo hallazgo y excelente para mí? – eddiecubed

+1

@yorkw 'getBitmap()' devuelve 'Bitmap' de forma predeterminada, ¿Por qué está encasillando de nuevo? – blizzard

+2

¿Hay una alternativa para esto ahora que 'BitmapDrawable' está en desuso? – AdamMc331

1

En mi aplicación, guardé Drawable/BitMap en Cache y lo paso usando la cadena de ruta del archivo en su lugar.

No era la solución que estaba buscando, pero al menos era una alternativa para su problema.

+1

Luego tenemos que guardar/eliminar dibujable de la memoria caché, ¿hay algo mal en el código anterior? – User7723337

Cuestiones relacionadas