example - xml drawable android
Come passare disegnabile tra le attività (5)
Come posso passare un'immagine, un tipo di disegno tra le attività?
Ci provo:
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);
Ma mi segnala un execption:
java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable
Molto meglio non passare (o serializzare) Drawables
tra le Activities
. Molto probabilmente stai ottenendo il drawable di una risorsa. Quindi c'è un ID risorsa. Passa invece in giro, è solo un int. E Drawable
il Drawable
nell'altra Activity
.
Se il Drawable
non proviene da una risorsa, ma è costruito in fase di esecuzione in memoria ... beh, ne parliamo. @Devunwired ha un bel suggerimento in quel caso.
Nel caso in cui estragga quelle immagini dal web e le carichi di nuovo e di nuovo, la loro memorizzazione nella cache sarebbe davvero una buona opzione dato che ridurrai il traffico di rete e aumenterai la velocità di caricamento. Suggerisco di usare WebImageView da Droid-Fu . Soluzione davvero buona, l'ho usata su alcuni progetti e ne sono molto soddisfatta.
Puoi semplicemente utilizzare un metodo buildDrawingCache
nativo:
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);
quindi prendilo in ImageActivity:
Bundle bundle = getIntent ().getExtras ();
if (bundle != null) {
ImageView imageView = findViewById (R.id.img_full);
Bitmap image = bundle.getParcelable ("image");
imageView.setImageBitmap (image);
}
Puoi taggare ogni immagine (in xml o programmaticlly) con il nome della risorsa immagine (come "img1.png"), quindi recuperare il nome dell'immagine usando getTag();
Quindi usa getResources().getIdentifier(image name,"drawable", .getPackageName())
per ottenere l'id della risorsa drawable.
E basta passare la risorsa id attraverso l'intento -
intent.putExtra("img 1",resource id);
Infine, il risultato dell'attività può creare l'immagine dalla risorsa usando:
getResources().getDrawable(intent.getIntExtra("img 1",-1));
1) Passaggio intento come extra
Nell'attività A decodifichi la tua immagine e la invii tramite intento:
- Usando questo metodo (extra) l'immagine viene passata in intervalli di 162 millisecondi
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);
Nell'attività B si riceve l'intento con l'array di byte (immagine decodificata) e lo si applica come origine 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) Salvataggio del file immagine e passaggio del suo riferimento a un'altra attività
- PERCHÉ farlo? - tratto da http://groups.google.com/group/android-developers/browse_frm/thread/9309931b3f060284#
"Il limite di dimensione è: mantienilo il più piccolo possibile, sicuramente non mettere un bitmap lì a meno che non sia più grande di un'icona (32x32 o qualsiasi altra cosa).
- In * Attività A * salva il file (Memoria interna)
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();
}
- Passa la posizione come stringa all'attività B
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
- In * Attività B * recuperare il file
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
- Fai * drawable * fuori dalla foto
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
- Applicalo alla risorsa ImageView
someImageView.setBackgroundDrawable(d);