web-dev-qa-db-de.com

Wie kann ich zwischen den Aktivitäten zeichnen?

Wie kann ich ein Bild zwischen verschiedenen Aktivitäten zeichnen?

Ich versuche das:

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

Aber es meldet mir eine Ausführung:

Java.lang.ClassCastException: Android.graphics.drawable.BitmapDrawable
27
android iPhone

1) Bestimmt als Extras übergeben

In der Aktivität A dekodieren Sie Ihr Bild und senden es per Absicht:

  • Bei Verwendung dieser Methode (Extras) wird das Bild in einem Zeitintervall von 162 Millisekunden übergeben
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);

In Aktivität B erhalten Sie die Absicht mit Byte-Array (dekodiertes Bild) und wenden sie als Quelle für ImageView an:

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) Speichern der Bilddatei und Übergeben ihrer reference an eine andere Aktivität

"Die Größenbegrenzung ist: Halten Sie es so klein wie möglich. Definieren Sie auf keinen Fall .__ eine Bitmap, es sei denn, sie ist nicht größer als ein Symbol (32x32 oder Was auch immer).

  • In * Aktivität A * Speichern der Datei (interner Speicher)
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();
}
  • Ort als Zeichenfolge an Aktivität B übergeben
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
  • In * Aktivität B * rufen Sie die Datei ab
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
  • * Zeichne * aus dem Bild
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
  • Wenden Sie es auf die ImageView-Ressource an
someImageView.setBackgroundDrawable(d);
50
user849998

Sie können jedes Bild (in der XML-Datei oder programmatisch) mit dem Bildressourcennamen (wie "img1.png"), Markieren und dann den Bildnamen mit der Funktion getTag(); abrufen.

Verwenden Sie dann getResources().getIdentifier(image name,"drawable", .getPackageName()), um die zu zeichnende Ressourcen-ID zu erhalten.

Und übergeben Sie einfach die Ressourcen-ID durch die Absicht - 

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

Zuletzt kann das Ergebnis Activity das Image aus der Ressource erstellen. 

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

Drawable-Objekte sind nicht inhärent serialisierbar und können daher nicht direkt in Intent-Extras übergeben werden. Sie müssen einen anderen Weg finden, die Bilddaten zu serialisieren oder persistieren und in der neuen Aktivität abzurufen.

Wenn Sie beispielsweise mit BitmapDrawable-Instanzen arbeiten, könnte die zugrunde liegende Bitmap in eine Datei geschrieben und zurückgelesen oder in ein Byte-Array serialisiert werden (sofern es klein genug ist), und das Byte-Array könnte über Extras einer Intent übergeben werden.

HTH

3
Devunwired

Es ist viel besser, Drawables nicht zwischen Activities zu übergeben (oder zu serialisieren). Sehr wahrscheinlich erhalten Sie das Zeichnungsfähige aus einer Ressource. Daher gibt es eine Ressourcen-ID. Übergeben Sie das stattdessen, das ist nur ein Int. Und die Drawable in die andere Activity erneut hydrieren.

Wenn die Variable Drawable nicht von einer Ressource stammt, sondern zur Laufzeit im Arbeitsspeicher erstellt wird ... lasst uns darüber sprechen. @Devunwired hat in diesem Fall einen netten Vorschlag.

2
superjos

Sie können einfach eine native buildDrawingCache-Methode verwenden:

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

dann holen Sie es sich bei Ihrer ImageActivity:

    Bundle bundle = getIntent ().getExtras ();

    if (bundle != null) {

        ImageView imageView = findViewById (R.id.img_full);

        Bitmap image = bundle.getParcelable ("image");
        imageView.setImageBitmap (image);

    }
0
Acuna

Wenn Sie diese Bilder aus dem Internet ziehen und immer wieder laden, wäre das Cachen ein wirklich guter Weg, da Sie den Netzwerkverkehr verringern und die Ladegeschwindigkeit erhöhen. Ich schlage vor, WebImageView von Droid-Fu zu verwenden. Wirklich gute Lösung, bei einigen Projekten eingesetzt und ich bin sehr zufrieden damit.

0
vbokan

Ich weiß nicht, ob dies der Fall ist, aber wenn Sie versuchen, ein Drawable zu übergeben, weil Sie eine Imageview verwenden, fügen Sie die Ressourcen-ID einfach in das Imageview-Tag ein und übergeben Sie das Tag als Ganzzahl anstelle von Zeichnen im Extra der Absicht und verwenden Sie folgende Zeile in der empfangenden Aktivität: imageView.setImageDrawable (getResources (). getDrawable (getIntent (). getIntExtra ("image_id", 0)));

Ich hoffe es hilft jemandem.

0
Eran Katsav