在我的应用程序中允许选择用户设备上的应用程序(例如“图库”)来选择图像。此图像显示在 Activity 屏幕上的 ImageView 窗口中。不幸的是,当我转动手机并改变方向时,图像丢失了,他们必须重新选择它。
如何保存位图图像并在方向改变后重新显示?
这是我用来让用户选择图像应用程序、选择图像并在 ImageView 窗口中显示图像的代码函数。
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK){
Uri targetUri = data.getData();
textTargetUri.setText(targetUri.toString());
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
targetImage.setImageBitmap(bitmap);
}
catch (FileNotFoundException e){
e.printStackTrace();
}
}
}
上面的函数是在我的 onCreate 中初始化的,以响应此代码中显示的按钮点击:
Button buttonLoadImage = (Button)findViewById(R.id.loadimage);
textTargetUri = (TextView)findViewById(R.id.targeturi);
targetImage = (ImageView)findViewById(R.id.targetimage);
buttonLoadImage.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);
}});
基本上,我只需要将这个 bool 值放在我的 onCreate 中,让它把图像放回窗口中。它还会显示显示图像在设备上的位置的文本,但对我而言,这不如让图像保留在屏幕上重要。
if (savedInstanceState != null) {
}
但似乎在方向改变后删除数据? 我不知道如何保存数据并将其还原以在该 bool 值中使用。 感谢您提供的任何建议、代码或链接!
更新:
使用评论中的两个建议,以及我从以前的研究中找到的一些代码,我能够编译一个解决方案。然而,虽然它解决了第一个问题,但它又产生了另一个问题,我将在展示我用来解决最初问题的代码后对其进行描述。
我发现我有 2 个选项可用于恢复部分。
要么我可以将它放在 onCreate 中:
if (savedInstanceState != null) {
//if there is a bundle, use the saved image resource (if one is there)
image = savedInstanceState.getParcelable("BitmapImage");
targetImage.setImageBitmap(image);
textTargetUri.setText(savedInstanceState.getString("path_to_picture"));R.drawable.camera_button);
}
这使我能够在设备上同时获得图像及其路径,以便在我的 Activity 中重新显示。
或者我可以在 onCreate 之后拥有它
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
image = savedInstanceState.getParcelable("BitmapImage");
targetImage.setImageBitmap(image);
textTargetUri.setText(savedInstanceState.getString("path_to_picture"));
}
我用的保存功能是
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putParcelable("BitmapImage", bitmap);
savedInstanceState.putString("path_to_picture", picture_location);
}
为了阐明 picture_location 的来源,回到我的 onActivityResult 函数中,我添加了一行并更改了另一行以保存路径字符串
if (resultCode == RESULT_OK){
Uri targetUri = data.getData();
picture_location = targetUri.toString();
textTargetUri.setText(picture_location);
对于在onCreate之前初始化的变量,
Bitmap image;
Bitmap bitmap;
String picture_location;
现在,我意识到这已经相当冗长了,但我希望它能帮助其他可能遇到类似问题的人。至于我之前提到的新问题,当我旋转我的 android 设备时,它实际上会保留数据并像我尝试做的那样重新显示它。但是,当我再次旋转屏幕时,原来的问题出现了;数据好像丢失了,没有显示在屏幕上。
我希望有一个更简单的修复,以便无论屏幕方向改变多少次,保存和恢复功能都能继续工作?
最佳答案
如果你存一个Bitmap
我觉得太贵了在onSaveInstanceState
,作为onSaveInstanceState
将在 onStop
之前调用每次,和Bitmap
是一件大事。
我认为最好保存一个 URI
在onSaveInstanceState
。
Uri mUri;
ImageView mImageView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
if (savedInstanceState != null){
mUri = savedInstanceState.getParcelable("uri");
mImageView.setImageURI(mUri);
}
}
protected void onActivityResult( int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK){
Uri targetUri = data.getData();
...
mUri = targetUri;
}
}
public void onSaveInstanceState(Bundle outState) {
if (mURI !=null) {
outState.putParcelable("uri", mUri);
}
}
关于android - 如何在方向更改期间将图像保留在 Android Activity 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21059140/