如何在活动之间传递drawable

我怎样才能传递一个图像,在活动之间绘制types?

我试试这个:

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)作为演员意图传递

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

活动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)保存图像文件并将其引用传递给另一个活动

“大小的限制是:保持尽可能小,绝对不要把一个位图,除非它不大于一个图标(32×32或其他)。

  • 在*活动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(); } 
  • 将位置作为string传递给活动B
 Intent intent = new Intent(this, ActivityB.class); intent.putExtra("picname", fileName); 
  • 在*活动B *检索文件
 Bundle extras = getIntent().getExtras(); String fileName = extras.getString("picname"); 
  • 使* drawable *出图片
 File filePath = getFileStreamPath(fileName); Drawable d = Drawable.createFromPath(filePath.toString()); 
  • 将其应用于ImageView资源
 someImageView.setBackgroundDrawable(d); 

您可以使用图像资源名称(如“img1.png”)标记每个图像(在xml或programmaticlly中),然后使用getTag();检索图像名称getTag();

然后使用getResources().getIdentifier(image name,"drawable", .getPackageName())来获取可绘制的资源ID。

只是通过意图传递资源ID –

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

最后,Activity可以使用以下方法从资源创build图像:

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

Drawable对象本身并不是可序列化的,所以它们不能直接在Intent extras中传递。 您必须find另一种方法来序列化或保留图像数据,并将其检索到新的“活动”中。

例如,如果您正在使用BitmapDrawable实例,则可以将底层Bitmap写入文件并读回,或者将其序列化为一个字节数组(如果它足够小),并且可以通过额外的Intent传递字节数组。

HTH

更好的是不要通过(或序列化) Activities Drawables 。 很可能你正在从资源中获取可绘制的。 因此有一个资源ID。 把它转过来,那只是一个整数。 在另一个 Activity重新水合Drawable

如果Drawable不是来自资源,而是在运行时在内存中构build的…那么让我们来谈谈它。 在这种情况下@Devunwired有一个很好的build议。

如果您从networking上拖动这些图片并一次又一次地加载它们,caching这些图片将是一个不错的select,因为您将减lessnetworkingstream量并提高加载速度。 我build议使用Droid-Fu的 WebImageView 。 真的很好的解决scheme,在一些项目中使用它,我非常满意。

我不知道是否是这种情况,但如果你想传递一个drawable的原因是因为你正在使用一个Imageview,只需将资源id放在imageview的标记中,将标记作为Integer而不是在接收活动中使用以下代码行:imageView.setImageDrawable(getResources()。getDrawable(getIntent()。getIntExtra(“image_id”,0)));

希望它能帮助别人。

你可以简单地使用一个本地的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); }