改变方向后 ImageView 消失

ImageView disappear after changed orientation

我刚刚在 Android 开始开发。到目前为止,我正在学习东西。我被这个问题困住了。在我的 onCreate 方法中,我有一个按钮 select 设备中的图像和 onActivityResult 获取图像并在 ImageView

中显示图像

在互联网上研究和寻找答案后,有人建议我缺少 onSaveInstanceState。所以我创造了它。这是我的代码。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button buttonLoadImage = (Button)findViewById(R.id.buttonLoadPicture);
    targetImage = (ImageView) findViewById(R.id.imgView);
    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, RESULT_LOAD_IMG);
        }
    });
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putParcelable("BitmapImage", bitmap);
    super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    image = savedInstanceState.getParcelable("BitmapImage");
    targetImage.setImageBitmap(image);
}

@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
        try {
            if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK){
                Uri targetUri = data.getData();

                String[] filePathColumn = { MediaStore.Images.Media.DATA };
                Cursor cursor = getContentResolver().query(targetUri, filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                imgDecodableString = cursor.getString(columnIndex);
                cursor.close();

                this.bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
                targetImage.setImageBitmap(bitmap);
            }
        }
        catch (FileNotFoundException e){
            e.printStackTrace();
        }

}

构建和 运行 代码后,select 处理图像并将其显示在 ImageView 中工作正常。当我改变方向时,图像 selected 仍然显示。然而,当我再次旋转回来时,显示的图像消失了。 我哪里做错了。感谢任何建议和帮助。

您是否正确存储 'bitmap'?这里你将它存储到一个局部变量中:

Bitmap bitmap;
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
            targetImage.setImageBitmap(bitmap);

你在这里使用了一个字段:

savedInstanceState.putParcelable("BitmapImage", bitmap);

该字段似乎未设置,因此 onSaveInstanceState 正在存储一个空值。尝试删除 Bitmap bitmap; 或将 bitmap = BitmapFactory... 更改为 this.bitmap = BitmapFactory.

编辑:

也尝试在此处存储位图:

image = savedInstanceState.getParcelable("BitmapImage");
targetImage.setImageBitmap(image);

通过将其更改为:

image = savedInstanceState.getParcelable("BitmapImage");
this.bitmap = image;
targetImage.setImageBitmap(this.bitmap);

我不确定图像是什么,因为您没有在 post 中包含声明。