如何使用Parcelable传递Drawable

时间:2012-04-09 08:55:22

标签: android parcelable

我有一个班级,我有一个Drawable成员 我用这个类作为Parcelable额外的活动跨活动发送数据。

为此我扩展了parceble,并实现了所需的功能。

我能够使用读/写int / string发送基本数据类型 但是在编组Drawable对象时我遇到了问题。

为此,我尝试将Drawable转换为byte array,但我正在获得类强制转换异常。

我正在使用以下代码将我的Drawable转换为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);

要将字节数组转换为Drawable,我使用以下代码:

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

当我运行这个时,我得到了类强制转换异常。

我们如何使用HashMap编写/传递Drawable?
我们有什么方法可以通过Parcel传递Drawable。

感谢。

2 个答案:

答案 0 :(得分:29)

由于您已在代码中将Drawable转换为位图,为什么不将Bitmap用作Parcelable类的成员。

Bitmap默认在API中实现Parcelable,通过使用Bitmap,您不需要在代码中执行任何特殊操作,它将由Parcel自动处理。

或者,如果您坚持使用Drawable,请将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);
  ... ...
}

希望这有帮助。

答案 1 :(得分:1)

在我的应用程序中,我将Drawable / BitMap保存到Cache中,并使用文件路径String传递它。

不是您正在寻找的解决方案,但至少可以替代您的问题。