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
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ść
- dlaczego? - wzięte z http://groups.google.com/group/android-developers/browse_frm/thread/9309931b3f060284 #
"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);
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));
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
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ę.
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.
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.
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);
}
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