2012-04-09 45 views
13

Tôi có một lớp học mà tôi có một Drawable là một thành viên.
Lớp học này tôi đang sử dụng để gửi dữ liệu qua các hoạt động dưới dạng chi tiết bổ sung Parcelable.Làm thế nào để vượt qua Drawable sử dụng Parcelable

Đối với điều đó tôi đã mở rộng parceble và triển khai các chức năng được yêu cầu.

Tôi có thể gửi các kiểu dữ liệu cơ bản bằng cách sử dụng đọc/ghi int/chuỗi.
Nhưng tôi đang gặp vấn đề trong khi marshaling đối tượng Drawable.

Đối với điều đó, tôi đã cố gắng chuyển đổi Drawable thành byte array, nhưng tôi đang nhận ngoại lệ cho lớp học.

Tôi đang sử dụng mã sau vào bí mật drawable của tôi để mảng 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); 

Và để chuyển đổi mảng byte để drawable tôi đang sử dụng đoạn mã sau:

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

Khi tôi chạy này tôi nhận được Class cast exception.

Làm thế nào chúng ta có thể viết/vượt qua Có thể vẽ bằng cách sử dụng HashMap?
Có cách nào để chúng tôi có thể vượt qua Drawable in Parcel hay không.

Cảm ơn.

Trả lời

25

Khi bạn đã chuyển đổi Drawable thành Bitmap trong mã của bạn, tại sao không sử dụng Bitmap làm thành viên của lớp Parcelable của bạn.

thực hiện Theo mặc định trong API, bằng cách sử dụng Bitmap, bạn không cần thực hiện bất kỳ điều gì đặc biệt trong mã của mình và nó sẽ tự động được Parcel xử lý.

Hoặc nếu bạn cứ khăng khăng sử dụng drawable, thực hiện Parcelable của bạn như là một cái gì đó như thế này:

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

Hope this helps.

+0

Vì vậy, ví dụ, nếu tôi có một đối tượng với một bitmap và các loại khác, tôi không phải viết hình ảnh trong bưu kiện? và nó sẽ làm việc tất cả tìm và dandy cho tôi? – eddiecubed

+1

@yorkw 'getBitmap()' trả về 'Bitmap' theo mặc định, Tại sao bạn lại gõ lại? – blizzard

+2

Có thay thế cho điều này bây giờ mà 'BitmapDrawable' không được chấp nhận? – AdamMc331

1

Trong ứng dụng của mình, tôi đã lưu Drawable/BitMap vào Cache và chuyển nó bằng chuỗi đường dẫn của tệp.

Không phải là giải pháp bạn đang tìm kiếm, nhưng ít nhất là một số giải pháp thay thế cho sự cố của bạn.

+1

Sau đó, chúng tôi phải lưu/xóa có thể drawable từ bộ nhớ cache, có điều gì sai trong mã trên không? – User7723337

Các vấn đề liên quan