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à

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




drawable