我的应用程序允许用户选择设备上的应用程序,例如“相册”,以选择图像。该图像在活动屏幕上的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);
}});
基本上,我只需要在onCreate中放置这个布尔值,并让它将图像放回窗口。它还显示文本,显示图像在设备上的位置,但对我来说,让图像保持在屏幕上更重要。
if (savedInstanceState != null) {
}
但是似乎在更改方向后会清除数据? 我不知道如何保存数据并将其还原以在该布尔值内使用。 感谢您提供的任何建议、代码或链接!
更新:
使用评论中的建议以及我之前找到的一些代码,我能够编译出一个解决方案。然而,虽然它解决了第一个问题,但它引发了另一个问题,我将在展示用于解决最初问题的代码后描述这个问题。
我发现恢复部分有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);
}
这使我能够在应用程序中重新显示图像及其路径。
或者我可以在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;
现在,我意识到这已经变得相当冗长了,但我希望它能帮助那些可能有类似问题的人。至于我之前提到的新问题,当我旋转我的安卓设备时,它确实保留了数据并重新显示了它,就像我想要做的那样。然而,当我再次旋转屏幕时,原来的问题出现了;数据似乎丢失了,没有显示在屏幕上。
我希望有一个更简单的解决方法,使保存和恢复功能无论屏幕方向改变多少次都能正常工作。