如何在方向更改期间将图像保留在Android活动中?

Dea*_*Doe 6 android image bitmap orientation imageview

我是Android编程的新手,并且一直在尝试构建应用程序.在我的新应用程序中,我让用户按下一个按钮,允许他们在他们的设备上选择一个应用程序,如"图库",以便选择图像.然后,该图像显示在活动屏幕上的图像视图窗口中.不幸的是,当我转动手机并改变方向时,图像会丢失,他们必须再次选择它.

如何保存位图图像并在方向更改后重新显示?

这是我用来让用户选择图像应用程序,选择图像,并在图像视图窗口中显示图像的代码函数.

@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();
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

上面的函数在我的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);
}});
Run Code Online (Sandbox Code Playgroud)

基本上,我只需要将这个布尔值放在我的onCreate中并让它将图像放回窗口中.它还显示文本,显示图像在设备上的位置,但这对我来说并不像能够让图像保留在屏幕上一样重要.

if (savedInstanceState != null) {


} 
Run Code Online (Sandbox Code Playgroud)

但它似乎在方向改变后擦除了数据?我不知道如何保存数据并将其恢复为在该布尔值内使用.我感谢您提供的任何建议,代码或链接!


更新:

感谢Vishal Vijay和rajahsekar的快速而有益的回复.使用您建议的编码以及我之前研究中发现的一些代码,我能够编译解决方案.然而,虽然它解决了第一个问题,但它产生了另一个我将在显示我用于解决初始问题的代码后将要描述的内容.

我发现我有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);
    }   
Run Code Online (Sandbox Code Playgroud)

这使我能够在设备上同时显示图像和路径,以便在我的活动中重新显示.

或者我可以在onCreate之后拥有它

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState){       
        image = savedInstanceState.getParcelable("BitmapImage");
        targetImage.setImageBitmap(image);
        textTargetUri.setText(savedInstanceState.getString("path_to_picture"));
}
Run Code Online (Sandbox Code Playgroud)

我使用的保存功能是

@Override 
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putParcelable("BitmapImage", bitmap);
    savedInstanceState.putString("path_to_picture", picture_location);
}   
Run Code Online (Sandbox Code Playgroud)

为了澄清picture_location来自哪里,回到我的onActivityResult函数中,我添加了一行并更改了另一行以保存路径字符串

if (resultCode == RESULT_OK){
    Uri targetUri = data.getData();
    picture_location = targetUri.toString();
    textTargetUri.setText(picture_location);
Run Code Online (Sandbox Code Playgroud)

至于在onCreate之前初始化的变量,

Bitmap image;
Bitmap bitmap;
String picture_location;
Run Code Online (Sandbox Code Playgroud)

现在,我意识到这已经变得相当冗长,但我希望它能帮助那些可能遇到类似问题的人.至于我之前提到的新问题,当我旋转我的Android设备时,它确实保留了数据并重新显示它,正如我试图做的那样.但是,当我再次旋转屏幕时,会出现原始问题; 数据似乎丢失,并且不会显示在屏幕上.

我希望有一个更简单的解决方案,以便无论屏幕方向改变多少次,保存和恢复功能都能继续工作?

再次感谢你们!

foo*_*man 6

Bitmap我认为如果你节省一个in 的话,成本太高了onSaveInstanceState,因为每次onSaveInstanceState之前都会被调用,并且onStopBitmap,而且是一件大事。

\n\n

我认为最好将 a 保存URIonSaveInstanceState\xe3\x80\x82中

\n\n
Uri mUri;\nImageView mImageView;\n\nprotected void onCreate(Bundle savedInstanceState) {\n  super.onCreate(savedInstanceState);\n  ...\n  if (savedInstanceState != null){\n    mUri = savedInstanceState.getParcelable("uri");\n    mImageView.setImageURI(mUri);\n  }\n}\n\n\nprotected void onActivityResult( int requestCode, int resultCode, Intent data) {\n    super.onActivityResult(requestCode, resultCode, data);\n    if (resultCode == RESULT_OK){\n        Uri targetUri = data.getData();\n        ...\n        mUri = targetUri;\n    }   \n}\npublic void onSaveInstanceState(Bundle outState) {\n        if (mURI !=null) {\n            outState.putParcelable("uri", mUri);\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n


Vis*_*jay 5

Bitmap image;

public void onCreat(..){
    if (savedInstanceState != null) {
        image = (Bitmap) savedInstanceState.getParcelableExtra("BitmapImage");; 
    } else { 
        image = yourBitmapImage;
    } 
}

@Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putExtra("BitmapImage", bitmap);
}
Run Code Online (Sandbox Code Playgroud)