アクティビティ間で画像、描画可能なタイプを渡すにはどうすればよいですか?
私はこれを試してください:
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);
しかし、それは私に実行を報告します:
Java.lang.ClassCastException: Android.graphics.drawable.BitmapDrawable
1)extrasとして意図を渡す
Activity Aでは、画像をデコードし、インテント経由で送信します:
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);
Activity Bでは、バイト配列(デコードされた画像)でインテントを受け取り、それをソースとして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)画像ファイルを保存し、そのreferenceを別のアクティビティに渡す
「サイズの制限は、できる限り小さくすることです。アイコン(32x32など)を超えない限り、ビットマップを絶対に入れないでください。
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();
}
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
someImageView.setBackgroundDrawable(d);
各画像(xml内またはプログラムで)に画像リソース名(「img1.png」など)をタグ付けし、getTag();
を使用して画像名を取得できます。
次に、getResources().getIdentifier(image name,"drawable", .getPackageName())
を使用して、描画可能なリソースIDを取得します。
そして、インテントを介してリソースIDを渡すだけです-
intent.putExtra("img 1",resource id);
最後に、結果アクティビティは以下を使用してリソースから画像を作成できます。
getResources().getDrawable(intent.getIntExtra("img 1",-1));
Drawable
オブジェクトは本質的にシリアル化できないため、Intent
extrasで直接渡すことはできません。画像データをシリアル化または永続化し、新しいアクティビティで取得する別の方法を見つける必要があります。
たとえば、BitmapDrawable
インスタンスを使用している場合、基になるBitmap
をファイルに書き出して読み戻すか、バイト配列(十分に小さい場合)とバイトにシリアル化できます。配列はIntent
のエクストラを介して渡すことができます。
HTH
Drawables
の中でActivities
を渡さない(またはシリアル化しない)方がはるかに優れています。リソースからドロアブルを取得している可能性が非常に高いです。したがって、リソースIDがあります。代わりに渡します。これは単なるintです。そして、他のDrawable
のActivity
を再水和します。
Drawable
がリソースからのものではなく、実行時にメモリに構築されている場合...それについて話しましょう。 @Devunwiredには、その場合の素晴らしい提案があります。
単純にネイティブ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);
imageActivityで取得します。
Bundle bundle = getIntent ().getExtras ();
if (bundle != null) {
ImageView imageView = findViewById (R.id.img_full);
Bitmap image = bundle.getParcelable ("image");
imageView.setImageBitmap (image);
}
これらの画像をWebから取得して何度も読み込む場合、ネットワークトラフィックを減らして読み込み速度を上げるので、それらをキャッシュすることは本当に良い選択肢です。 Droid-F から WebImageView を使用することをお勧めします。本当に良い解決策であり、いくつかのプロジェクトでそれを使用しました。私は非常に満足しています。
これが事実かどうかはわかりませんが、Drawableを渡そうとしている理由がImageviewを使用しているためである場合、imageviewのタグにリソースIDを入れるだけで、タグを整数ではなく整数として渡しますインテントのエクストラで描画可能で、受信アクティビティで次の行を使用します。imageView.setImageDrawable(getResources()。getDrawable(getIntent()。getIntExtra( "image_id"、0)));
それが誰かを助けることを願っています。