Подтвердить что ты не робот

Как передать Drawable используя Parcelable

У меня есть класс, в котором у меня есть Drawable как член.
Этот класс, который я использую для отправки данных через действия как Parcelable extra.

Для этого я расширил parceble и реализовал требуемые функции.

Я могу отправить основные типы данных, используя read/write int/string.
Но я столкнулся с проблемой при маршалинге объекта Drawable.

Для этого я попытался преобразовать Drawable в byte array, но я получаю исключения класса.

Я использую следующий код для скрытия моего массива Drawable to 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));

Когда я запустил это, я получаю исключение класса cast.

Как мы можем написать/передать Drawable с помощью HashMap?
Есть ли способ, с помощью которого мы можем пройти Drawable в Parcel.

Спасибо.

4b9b3361

Ответ 1

Как вы уже конвертируете Drawable в Bitmap в свой код, почему бы не использовать Bitmap в качестве члена вашего класса Parcelable.

Bitmap реализует Parcelable по умолчанию в API, используя Bitmap, вам не нужно делать что-либо особенное в вашем коде, и это будет автоматически обрабатываться посылкой.

Или, если вы настаиваете на использовании 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);
  ... ...
}

Надеюсь, что это поможет.

Ответ 2

В моем приложении я сохранил Drawable/BitMap в Cache и передал его, используя путь к файлу String.

Не решение, которое вы искали, но, по крайней мере, альтернативу вашей проблеме.