2012-04-09 39 views
13

我有一門課,我有一個Drawable作爲成員。
我正在使用這個類來發送數據作爲Parcelable額外的活動。如何使用Parcelable傳遞Drawable

爲此,我擴展了parceble,並實現了所需的功能。

我能夠使用讀/寫int /字符串發送基本數據類型。
但我編組Drawable對象時遇到問題。

爲此,我試圖將Drawable轉換爲byte array,但我得到了類轉換異常。

我使用下面的代碼我可繪製隱蔽到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); 

而且轉換字節數組繪製我用下面的代碼:

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

當我運行此我得到類拋出異常。

我們如何使用HashMap寫/傳遞Drawable?
有沒有什麼辦法可以在包裹中傳遞Drawable。

謝謝。

回答

25

由於您已經在代碼中將Drawable轉換爲位圖,爲什麼不使用Bitmap作爲Parcelable類的成員。

通過使用位圖在API中默認實現Parcelable,您不需要在代碼中執行任何特殊操作,它將自動由Parcel處理。

或者,如果你堅持使用可繪製,實現您的Parcelable因爲這樣的事情:

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

希望這有助於。

+0

因此,例如,如果我有一個位圖和其他類型的對象,我不必在包裹中寫入圖像?它會爲我找到所有的東西和花花公子? – eddiecubed 2013-10-11 15:52:58

+1

@yorkw'getBitmap()'默認返回'Bitmap',爲什麼你再次類型化? – blizzard 2015-03-07 05:39:09

+2

現在是否有替代方案,因爲'BitmapDrawable'已被棄用? – AdamMc331 2015-08-17 02:37:17

1

在我的應用程序中,我將Drawable/BitMap保存到Cache中,並使用文件的路徑String來傳遞它。

不是您正在尋找的解決方案,而是您的問題的至少一些替代方案。

+1

然後我們必須從緩存中保存/刪除drawable,上面的代碼中有什麼錯誤嗎? – User7723337 2012-04-09 09:27:20

相關問題