如何使用Parcelable传递Drawable

17
我有一个类,在其中我有一个成员Drawable
我将此类用作发送数据的活动间传递的Parcelable额外信息。
为此,我扩展了Parcelable并实现了所需的函数。
我能够使用read/write int/string发送基本数据类型。但是在编组Drawable对象时遇到了问题。
为此,我尝试将Drawable转换为byte array,但是出现了类转换异常。
我正在使用以下代码将我的Drawable转换为字节数组:
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));

运行此代码时出现了ClassCastException异常。

我们如何使用HashMap写入/传递Drawable?
是否有一种方法可以在Parcel中传递Drawable。

谢谢。

2个回答

31

既然您在代码中已经将Drawable转换为Bitmap,为什么不将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);
  ... ...
}

希望这有所帮助。

例如,如果我有一个包含位图和其他类型的对象,我不需要在包裹中写入图像吗?这样对我来说一切都可以正常工作吗? - eddiecubed
1
@yorkw getBitmap() 默认返回 Bitmap,为什么你还要进行类型转换呢? - blizzard
2
现在BitmapDrawable被弃用了,有什么替代选项吗? - AdamMc331
嘿,@McAdam331,我相信你已经完成了这部分,但我把它发布出来供其他人使用。 - kirti Hudda
新的BitmapDrawable(Resources.getSystem(), bitmap); - JamisonMan111

1
在我的应用程序中,我将Drawable/BitMap保存到缓存中,并使用文件路径字符串传递它。
这可能不是您正在寻找的解决方案,但至少可以作为您问题的替代方案。

1
那么我们需要将可绘制对象从缓存中保存/删除,以上代码有什么问题吗? - User7723337

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接