android - 如何在方向更改期间将图像保留在 Android Activity 中?

标签 android image bitmap imageview orientation

在我的应用程序中允许选择用户设备上的应用程序(例如“图库”)来选择图像。此图像显示在 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是一件大事。

我认为最好保存一个 URIonSaveInstanceState

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/

相关文章:

android - 部署到 Artifact 后不包含外部依赖项

android - 如何在运行时将图像从 Android 设备的图库映射到 Unity 应用程序中的纹理?

c# - 保存位图时背景变黑 - C#

C++ Gdiplus 单色像素值

android - 在android中实现推送通知的指南

android - 按后退按钮返回 Fragments

python - 使用Opencv和pytesseract进行验证码预处理和求解

c++ - OpenCV 在没有 RGB 转换的情况下从相机捕获 YUYV

javascript - 非常简单的 Javascript 广告转换引擎

c - 填充位图像素数组