我正在编写一个简单的应用,通过调用相机的ImageView
将图像设置为Intent
。但是当我改变方向时,图像会消失。我已经尝试过这些问题Q1,Q2。之前的问题建议使用onSaveInstanceState
或在配置更改期间保留对象。
但在Android docs我读过:
您可能会遇到这样一种情况,即重新启动应用程序并恢复大量数据可能成本高昂且用户体验不佳
因此,如果Bitmap
被认为是“大量数据”,我将需要使用setRetainInstance
,但在文档中说:
虽然您可以存储任何对象,但您永远不应传递与Activity关联的对象,例如Drawable,Adapter,View或与Context关联的任何其他对象
我应该使用什么方法才能在方向更改时恢复图像?
private ImageView mPhotoImgage;
private Bitmap mCameraData;
onCreate {
mPhotoImgage = (ImageView) findViewById(R.id.photoResultImage);
if (savedInstanceState != null){
mPhotoImgage.setImageBitmap((Bitmap)savedInstanceState.getParcelable(IMAGE_RESOURCE));
}
}
onResume{
if (mCameraData != null){
mPhotoImgage.setImageBitmap(mCameraData);
}
super.onResume();
}
onSaveInstanceState{
outState.putParcelable(IMAGE_RESOURCE, mCameraData);
super.onSaveInstanceState(outState);
}
但是在两个方向改变后,图像消失了。
答案 0 :(得分:1)
您应该使用onResume方法在活动恢复时设置图像
@Override
protected void onResume() {
//your code here
super.onResume();
}
你不需要保存的实例,只需复制你在onCreate上使用的代码,将你的图像设置为onResume,它应该可以工作。
例如,如果你有onCreate:
imageView im.setImageResource(R.drawable.image);
将它用于onResume:
@Override
protected void onResume() {
imageView im.setImageResource(R.drawable.image);
super.onResume();
}
答案 1 :(得分:1)
您可以改为要求相机将捕获的图像保存到外部存储器(如果可用)。您可以告诉它保存图像的位置,这意味着您可以将文件URI存储在onSaveInstanceState
中,并在恢复状态时从该URI加载它。
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(context.getExternalFilesDir(null), "randomfilename")));
startActivityForResult(cameraIntent, RC_CAMERA);
您应该跟踪不再需要该文件的时间并将其删除。
这种方法的另一个优点是,您可以在将图像加载到内存之前找出图像的尺寸。