2012-04-09 9 views
13

Ich habe eine Klasse, wo ich eine Drawable als Mitglied haben.
Diese Klasse verwende ich zum Senden von Daten über Aktivitäten als Parcelable extra.So übergeben Sie Drawable mit Parcelable

Dafür habe ich das Parceble erweitert und die erforderlichen Funktionen implementiert.

Ich bin in der Lage, die grundlegenden Datentypen mithilfe von lesen/schreiben int/string.
Aber ich habe Probleme beim Marshalling der Drawable-Objekt.

Dafür habe ich versucht, die Drawable in byte array zu konvertieren, aber ich bekomme Klassenausnahmen Exceptions.

ich folgenden Code bin mit meinem Drawable auf Byte-Array verdeckte:

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

Und Byte-Array zu konvertieren drawable i folgenden Code verwenden:

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

Wenn ich diese laufen bekomme ich Class-Cast-Ausnahme

Wie können wir Drawable mit der HashMap schreiben/übergeben?
Gibt es eine Möglichkeit, wie wir Drawable im Paket übergeben können.

Danke.

Antwort

25

Da Sie in Ihrem Code bereits Drawable in Bitmap konvertieren, verwenden Sie Bitmap als Mitglied Ihrer Parcelable-Klasse.

implementiert Parcelable standardmäßig in API, mit Bitmap, müssen Sie nichts Besonderes in Ihrem Code tun, und es wird automatisch von Parcel behandelt.

Oder wenn Sie darauf bestehen, Drawable zu verwenden, implementieren Ihre Parcel als so etwas wie dieses:

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

Hoffnung, das hilft.

+0

Also zum Beispiel, wenn ich ein Objekt mit einer Bitmap und anderen Typen habe, muss ich das Bild nicht in das Paket schreiben? und es wird alles funktionieren, finde und dandy für mich? – eddiecubed

+1

@yorkw 'getBitmap()' '' gibt 'Bitmap' standardmäßig zurück, warum Sie wieder tippen? – blizzard

+2

Gibt es eine Alternative dafür, dass "BitmapDrawable" veraltet ist? – AdamMc331

1

In meiner App habe ich Drawable/BitMap in den Cache gespeichert und über die Pfadzeichenfolge übergeben.

Keine Lösung, die Sie gesucht haben, aber zumindest eine Alternative für Ihr Problem.

+1

Dann müssen wir aus dem Cache speichern/löschen, gibt es etwas falsch in oben genannten Code? – User7723337

Verwandte Themen