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

Как пройти между действиями

Как передать изображение, тип рисунка между действиями?

Я пробую это:

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
4b9b3361

Ответ 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);

    }