Как пройти между действиями
Как передать изображение, тип рисунка между действиями?
Я пробую это:
private Drawable imagen;
Bundle bundle = new Bundle();
bundle.putSerializable("imagen", (Serializable) unaReceta.getImagen());
Intent myIntent = new Intent(v.getContext(), Receta.class);
myIntent.putExtras(bundle);
startActivityForResult(myIntent, 0);
Но он сообщает мне об исключении:
java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable
Ответы
Ответ 1
1) Передача в качестве дополнений
В действии A вы декодируете свое изображение и отправляете его с помощью намерения:
- Использование этого метода (дополнительные) изображения передается через промежуток времени в 162 миллисекунд
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picture", b);
startActivity(intent);
В действии B вы получаете намерение с массивом байтов (декодированное изображение) и применяете его как источник для ImageView:
Bundle extras = getIntent().getExtras();
byte[] b = extras.getByteArray("picture");
Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);
image.setImageBitmap(bmp);
2) Сохранение файла изображения и передача его ссылки в другую деятельность
"Предел размера: держите его как можно меньше. Определенно не ставьте растровое изображение там, если оно не больше значка (32x32 или что угодно).
- In * Activity A * сохранить файл (внутреннее хранилище)
String fileName = "SomeName.png";
try {
FileOutputStream fileOutStream = openFileOutput(fileName, MODE_PRIVATE);
fileOutStream.write(b); //b is byte array
//(used if you have your picture downloaded
// from the *Web* or got it from the *devices camera*)
//otherwise this technique is useless
fileOutStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
- Переместить местоположение как String в Activity B
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
- In * Activity B * извлекает файл
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
- Сделайте * drawable * из картинки
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
- Примените его к ресурсу ImageView
someImageView.setBackgroundDrawable(d);
Ответ 2
Вы можете пометить каждое изображение (в xml или programaticallylly) с именем ресурса изображения (например, "img1.png" )
затем введите имя изображения, используя getTag();
Затем используйте getResources().getIdentifier(image name,"drawable", .getPackageName())
для получения идентификатора ресурса ресурса.
И просто передайте идентификатор ресурса через намерение -
intent.putExtra("img 1",resource id);
Наконец, результат Activity может создать изображение из ресурса, используя:
getResources().getDrawable(intent.getIntExtra("img 1",-1));
Ответ 3
Drawable
объекты по сути не являются сериализуемыми, поэтому их нельзя передавать непосредственно в Intent
дополнениях. Вы должны найти другой способ сериализации или сохранения данных изображения и получить его в новом действии.
Например, если вы работаете с экземплярами BitmapDrawable
, базовый Bitmap
можно записать в файл и прочитать или сериализовать в массив байтов (если его достаточно мало) и массив байтов может быть прошел через дополнительные функции Intent
.
НТН
Ответ 4
Намного лучше не пропускать (или сериализовать) Drawables
вокруг Activities
. Скорее всего, вы получаете доступный ресурс. Следовательно, есть идентификатор ресурса. Передайте это вместо этого, это просто int. И повторно гидратируйте Drawable
в другом Activity
.
Если Drawable
не поступает с ресурса, но он создается во время выполнения в памяти... хорошо, пусть говорят об этом. @Devunwired имеет хорошее предложение в этом случае.
Ответ 5
Если вы вытащите эти изображения из Интернета и загрузите их снова и снова, кеширование их будет действительно хорошим вариантом, так как вы уменьшите сетевой трафик и увеличите скорость загрузки. Я предлагаю использовать WebImageView из Droid-Fu. Действительно хорошее решение, использовало его в некоторых проектах, и я очень доволен им.
Ответ 6
Я не знаю, так ли это, но если причина, по которой вы пытаетесь передать drawable, состоит в том, что вы используете Imageview, просто поместите идентификатор ресурса в тег imageview, передайте тег как целое число вместо вычитаемого в намерении дополнительно и использовать следующую строку в принимающей деятельности: imageView.setImageDrawable(.. GetResources() getDrawable (getIntent() getIntExtra ( "image_id", 0)));
Надеюсь, что это поможет кому-то.
Ответ 7
Вы можете просто использовать собственный метод buildDrawingCache
:
ImageView imageView = imageLayout.findViewById (R.id.img_thumb);
imageView.buildDrawingCache ();
Bundle extras = new Bundle ();
extras.putParcelable ("image", imageView.getDrawingCache ());
Intent intent = new Intent (this, ImageActivity.class);
intent.putExtras (extras);
startActivity (intent);
то получите его в свой ImageActivity:
Bundle bundle = getIntent ().getExtras ();
if (bundle != null) {
ImageView imageView = findViewById (R.id.img_full);
Bitmap image = bundle.getParcelable ("image");
imageView.setImageBitmap (image);
}