Cómo pasar dibujable entre actividades

¿Cómo puedo pasar una imagen, tipo dibujable entre actividades?

Intento esto:

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); 

Pero me reporta una execption:

 java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable 

1) Pasar en bash como extras

En la Actividad A , decodifica su imagen y la envía por intención:

  • Al usar este método (extras) la imagen se pasa en un intervalo de tiempo de 162 milisegundos
 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); 

En la Actividad B recibes la intención con la matriz de bytes (imagen decodificada) y la aplicas como fuente a 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) Guardar archivo de imagen y pasar su referencia a otra actividad

“El límite de tamaño es: mantenlo lo más pequeño posible. Definitivamente no coloques un bitmap a menos que no sea más grande que un ícono (32×32 o lo que sea).

  • En * Actividad A * guarde el archivo (Almacenamiento interno)
 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(); } 
  • Pasar la ubicación como Cadena a la Actividad B
 Intent intent = new Intent(this, ActivityB.class); intent.putExtra("picname", fileName); 
  • En * Actividad B * recuperar el archivo
 Bundle extras = getIntent().getExtras(); String fileName = extras.getString("picname"); 
  • Hacer * dibujable * fuera de la imagen
 File filePath = getFileStreamPath(fileName); Drawable d = Drawable.createFromPath(filePath.toString()); 
  • Aplicarlo al recurso ImageView
 someImageView.setBackgroundDrawable(d); 

Puede etiquetar cada imagen (en el xml, o programmaticlly) con el nombre del recurso de la imagen (como “img1.png”), luego recuperar el nombre de la imagen usando el getTag();

A continuación, utilice getResources().getIdentifier(image name,"drawable", .getPackageName()) para obtener la id del recurso dibujable.

Y solo pase la identificación del recurso a través de la intención:

 intent.putExtra("img 1",resource id); 

Por último, el resultado Activity puede crear la imagen desde el recurso usando:

 getResources().getDrawable(intent.getIntExtra("img 1",-1)); 

Drawable objetos Drawable no son inherentemente serializables, por lo que no se pueden pasar directamente en los extras de Intent . Debe encontrar otra forma de serializar o persistir los datos de imagen y recuperarlos en la nueva Actividad.

Por ejemplo, si está trabajando con instancias de BitmapDrawable , el Bitmap subyacente podría escribirse en un archivo y leerse, o serializarse en una matriz de bytes (si es lo suficientemente pequeña) y la matriz de bytes podría pasarse a través de los extras de un Intent .

HTH

Mucho mucho mejor no pasar (o serializar) Drawables entre Activities . Es muy probable que estés sacando un recurso de un recurso. Por lo tanto, hay una ID de recurso. Pase eso, es solo un int. Y rehidrata el Drawable en la otra Activity .

Si el Drawable no proviene de un recurso, sino que está construido en tiempo de ejecución en la memoria … bueno, hablemos de ello. @Devunwired tiene una buena sugerencia en ese caso.

En caso de que saque esas imágenes de la web y las cargue una y otra vez, almacenarlas en caché sería una buena opción, ya que disminuirá el tráfico de la red y boostá la velocidad de carga. Sugiero usar WebImageView de Droid-Fu . Una solución realmente buena, la usé en algunos proyectos y estoy muy satisfecho con ella.

No sé si este es el caso, pero si la razón por la que está tratando de pasar un dibujable es porque está utilizando una vista de imagen, simplemente coloque el identificador de recurso en la etiqueta de la imagen, pase la etiqueta como un entero en lugar de la dibujable en la intención adicional y use la siguiente línea en la actividad receptora: imageView.setImageDrawable (getResources (). getDrawable (getIntent (). getIntExtra (“image_id”, 0)));

Espero que ayude a alguien.

Simplemente puede usar un método nativo 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); 

luego obténgalo en su ImageActivity:

  Bundle bundle = getIntent ().getExtras (); if (bundle != null) { ImageView imageView = findViewById (R.id.img_full); Bitmap image = bundle.getParcelable ("image"); imageView.setImageBitmap (image); }