Как передать 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.
Спасибо.
Ответы
Ответ 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.
Не решение, которое вы искали, но, по крайней мере, альтернативу вашей проблеме.