如何在活动之间传递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); }