web-dev-qa-db-ja.com

アクティビティ間でドロアブルを渡す方法

アクティビティ間で画像、描画可能なタイプを渡すにはどうすればよいですか?

私はこれを試してください:

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
29
android iPhone

1)extrasとして意図を渡す

Activity Aでは、画像をデコードし、インテント経由で送信します:

  • このメソッド(extras)を使用すると、イメージは162ミリ秒の時間間隔で渡されます
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など)を超えない限り、ビットマップを絶対に入れないでください。

  • *アクティビティA *でファイルを保存します(内部ストレージ)
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();
}
  • 場所を文字列としてアクティビティBに渡す
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
  • * Activity B *でファイルを取得します
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
  • 画像から*描画可能*にする
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
  • ImageViewリソースに適用します
someImageView.setBackgroundDrawable(d);
52
user849998

各画像(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));    
4
user3782996

Drawableオブジェクトは本質的にシリアル化できないため、Intent extrasで直接渡すことはできません。画像データをシリアル化または永続化し、新しいアクティビティで取得する別の方法を見つける必要があります。

たとえば、BitmapDrawableインスタンスを使用している場合、基になるBitmapをファイルに書き出して読み戻すか、バイト配列(十分に小さい場合)とバイトにシリアル化できます。配列はIntentのエクストラを介して渡すことができます。

HTH

3
Devunwired

Drawablesの中でActivitiesを渡さない(またはシリアル化しない)方がはるかに優れています。リソースからドロアブルを取得している可能性が非常に高いです。したがって、リソースIDがあります。代わりに渡します。これは単なるintです。そして、他のDrawableActivityを再水和します。

Drawableがリソースからのものではなく、実行時にメモリに構築されている場合...それについて話しましょう。 @Devunwiredには、その場合の素晴らしい提案があります。

2
superjos

単純にネイティブ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);

    }
0
Acuna

これらの画像をWebから取得して何度も読み込む場合、ネットワークトラフィックを減らして読み込み速度を上げるので、それらをキャッシュすることは本当に良い選択肢です。 Droid-F から WebImageView を使用することをお勧めします。本当に良い解決策であり、いくつかのプロジェクトでそれを使用しました。私は非常に満足しています。

0
vbokan

これが事実かどうかはわかりませんが、Drawableを渡そうとしている理由がImageviewを使用しているためである場合、imageviewのタグにリソースIDを入れるだけで、タグを整数ではなく整数として渡しますインテントのエクストラで描画可能で、受信アクティビティで次の行を使用します。imageView.setImageDrawable(getResources()。getDrawable(getIntent()。getIntExtra( "image_id"、0)));

それが誰かを助けることを願っています。

0
Eran Katsav