2012-04-09 8 views
13

Ho una classe in cui ho un Drawable come membro.
Questa classe che sto utilizzando per l'invio di dati tra le attività come un extra Parcelable.Come passare disegnabile utilizzando Parcelable

Per questo ho esteso il parceble e implementato le funzioni richieste.

Sono in grado di inviare i tipi di dati di base utilizzando int/string di lettura/scrittura.
Ma sto affrontando il problema mentre eseguo il marshalling dell'oggetto Drawable.

Per quello ho provato a convertire il Drawable in byte array, ma sto ottenendo eccezioni di cast di classe.

Sto usando il codice seguente per convertire il mio Drawable a matrice Byte:

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); 

E per convertire array di byte in drawable sto usando seguente codice:

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

Quando ho eseguito questo ottengo Eccezione cast di classe.

Come possiamo scrivere/passare disegni utilizzando HashMap?
Esiste un modo per passare Drawable in Parcel.

Grazie.

risposta

25

Come già si converte Drawable in Bitmap nel proprio codice, perché non utilizzare Bitmap come membro della classe Parcelable.

implementazioni Parcelable di default in API, utilizzando Bitmap, non è necessario fare nulla di speciale nel codice e verrà gestito automaticamente da Parcel.

Oppure, se ti ostini a usare Drawable, implementare il Parcelable come qualcosa di simile a questo:

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); 
    ... ... 
} 

Spero che questo aiuti.

+0

Quindi, ad esempio, se ho un oggetto con una bitmap e altri tipi, non devo scrivere l'immagine nel pacco? e funzionerà tutto per trovare e dandy per me? – eddiecubed

+1

@yorkw 'getBitmap()' restituisce 'Bitmap' in modo predefinito, perché si esegue di nuovo il typecasting? – blizzard

+2

Esiste un'alternativa per questo ora che 'BitmapDrawable' è deprecato? – AdamMc331

1

Nella mia app, ho salvato Drawable/BitMap in Cache e lo ho passato usando la stringa del percorso del file.

Non è una soluzione che stavi cercando, ma almeno qualche alternativa per il tuo problema.

+1

Quindi dobbiamo salvare/eliminare drawable dalla cache, c'è qualcosa di sbagliato nel codice precedente? – User7723337

Problemi correlati