Jak przejść między zajęciami

Jak mogę przekazać obraz, rysowalny Typ między działaniami?

Próbuję tego:

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

Ale to mi zgłasza wykonanie:

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable
Author: Jonathan Leffler, 2011-12-07

7 answers

1) Przejście W intencji jako dodatki

W aktywności a dekodujesz swój obraz i wysyłasz go poprzez intencję:

  • za pomocą tej metody (extras) obraz jest przekazywany w interwale czasu 162 milisekund
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);

W aktywności B otrzymujesz intent z tablicą bajtów (dekodowany obraz) i zastosujesz go jako źródło do 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) zapisanie pliku obrazu i przekazanie jego referencji do innego aktywność

"limit rozmiaru jest taki, aby był jak najmniejszy. Zdecydowanie nie wkładaj bitmapę tam, chyba że nie jest ona większa niż ikona (32x32 lub nieważne).

  • w * aktywności A * zapisz plik (Pamięć wewnętrzna)
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();
}
  • przekaż lokalizację jako ciąg znaków do aktywności B
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
  • w * ćwiczeniu B * pobierz plik
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
  • Make *drawable * out of the picture
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
  • zastosuj go do zasobu ImageView
someImageView.setBackgroundDrawable(d);
 50
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 14:00:00

Możesz oznaczyć każdy obraz (w xml, lub programmaticlly) nazwą zasobu obrazu (np. " img1.png"), następnie pobierz nazwę obrazu za pomocą getTag();

Następnie użyj getResources().getIdentifier(image name,"drawable", .getPackageName()), aby uzyskać drawable resource id.

I po prostu podaj identyfikator zasobu przez intent-

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

Wreszcie działanie wynik może utworzyć obraz z zasobu za pomocą:

getResources().getDrawable(intent.getIntExtra("img 1",-1));    
 4
Author: user3782996,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 12:16:31

Drawable obiekty nie są z natury serializowalne, więc nie mogą być przekazywane bezpośrednio w Intent dodatkach. Musisz znaleźć inny sposób na serializację lub utrwalenie danych obrazu i pobranie ich w nowej aktywności.

Na przykład, jeśli pracujesz z instancjami BitmapDrawable, bazowa Bitmap może zostać zapisana do pliku i odczytana z powrotem lub serializowana do tablicy bajtów (jeśli jest wystarczająco mała), a tablica bajtów może być przekazywana przez dodatki Intent.

HTH

 3
Author: Devunwired,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-06 22:02:52

Dużo dużo lepiej nie przepuszczać (lub serializować) Drawables wokół Activities. Bardzo prawdopodobne, że są coraz wyciągnąć z zasobu. Stąd jest identyfikator zasobu. Przekaż to zamiast tego, to tylko int. I ponownie uwodnić Drawable w drugiej Activity.

Jeśli Drawable nie pochodzi z zasobu, ale jest budowany w czasie wykonywania w pamięci ... porozmawiajmy o tym. @Devunwired ma w tym przypadku fajną propozycję.

 2
Author: superjos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 10:05:48

W przypadku, gdy wyciągniesz te obrazy z sieci i załadujesz je ponownie i ponownie, buforowanie ich byłoby naprawdę dobrą opcją, ponieważ zmniejszysz ruch sieciowy i zwiększysz prędkość ładowania. Sugeruję użycie WebImageView z Droid-Fu. Naprawdę dobre rozwiązanie, korzystałem z niego w niektórych projektach i jestem z niego bardzo zadowolony.

 0
Author: vbokan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 01:12:38

Nie wiem, czy tak jest, ale jeśli powodem, dla którego próbujesz przekazać drawable jest to, że używasz Imageview, po prostu umieść identyfikator zasobu w znaczniku imageview, przekaż znacznik jako liczbę całkowitą zamiast drawable w intent ' s extra i użyj następującej linii w działaniu odbierającym: imageView.setImageDrawable (getResources ().getDrawable (getIntent ().getIntExtra ("image_id",0)));

Mam nadzieję, że to komuś pomoże.

 0
Author: Eran Katsav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-28 21:42:43

Możesz po prostu użyć natywnej metody 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);

To zrób to na swoje zdjęcie:

    Bundle bundle = getIntent ().getExtras ();

    if (bundle != null) {

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

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

    }
 0
Author: Acuna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 13:56:24