在方向更改时将图像还原到ImageView

时间:2014-05-30 22:15:00

标签: android bitmap orientation-changes

我正在编写一个简单的应用,通过调用相机的ImageView将图像设置为Intent。但是当我改变方向时,图像会消失。我已经尝试过这些问题Q1Q2。之前的问题建议使用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);
}

但是在两个方向改变后,图像消失了。

2 个答案:

答案 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);

您应该跟踪不再需要该文件的时间并将其删除。

这种方法的另一个优点是,您可以在将图像加载到内存之前找出图像的尺寸。