如何在活动之间传递图像,可绘制类型?
我试试这个:
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
答案 0 :(得分:50)
1)将意图传递为附加内容
在活动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)保存图片文件并将参考传递给其他活动
“尺寸限制是:保持尽可能小。绝对不要放 一个位图,除非它不大于一个图标(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);
答案 1 :(得分:4)
您可以使用图像资源名称(例如" img1.png")标记每个图像(在xml中或以编程方式),
然后使用getTag();
然后使用getResources().getIdentifier(image name,"drawable", .getPackageName())
获取可绘制资源ID。
只需通过意图传递资源ID -
intent.putExtra("img 1",resource id);
最后,结果Activity可以使用以下命令从资源创建图像:
getResources().getDrawable(intent.getIntExtra("img 1",-1));
答案 2 :(得分:3)
Drawable
个对象本身并不是可序列化的,因此无法直接在Intent
个附加内容中传递它们。您必须找到另一种方法来序列化或保留图像数据并在新的Activity中检索它。
例如,如果您正在使用BitmapDrawable
个实例,则可以将基础Bitmap
写入文件并读回,或序列化为字节数组(如果它足够小)和字节数组可以通过Intent
的附加内容传递。
HTH
答案 3 :(得分:2)
最好不要在Drawables
中传递(或序列化)Activities
。您很可能从资源中获取可绘制的内容。因此,有一个资源ID。相反,传递它,这只是一个int。并重新补充其他 Drawable
中的Activity
。
如果Drawable
不是来自资源,而是在运行时在内存中构建......那么让我们谈谈它。 @Devunwired在这种情况下有一个很好的建议。
答案 4 :(得分:0)
如果您从网络中提取这些图像并反复加载它们,那么缓存它们将是非常好的选择,因为您将减少网络流量并提高加载速度。我建议使用WebImageView中的Droid-Fu。非常好的解决方案,在某些项目中使用它,我对它非常满意。
答案 5 :(得分:0)
我不知道是否是这种情况,但是如果您尝试传递drawable的原因是因为您使用的是Imageview,只需将资源ID放在imageview的标记中,将标记作为Integer传递而不是intent的extra中的drawable,并在接收活动中使用以下行: imageView.setImageDrawable(。getResources()getDrawable(getIntent()getIntExtra( “image_id”,0)));
希望它会对某人有所帮助。
答案 6 :(得分:0)
您只需使用原生@Autowired
private Step2ItemProcessor listObject;
方法:
buildDrawingCache
然后在你的ImageActivity上获取它:
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);