更改布局时保存位图

时间:2015-03-26 08:38:24

标签: android bitmap

我设置了纵向布局和横向布局。在这些布局中,有一个带有onClick侦听器的ImageView。我的ImageView有一个默认图像(相机图标) 当我进入ImageView时,打开一个对话框,我可以打开相机并拍照或打开图库并选择图像。 然后,我保存一个位图并将其放在ImageView中。这个位图是我班上的一个全局变量。

但是当我转动我的应用程序时,加载我的其他布局(main_landscape),如果我拍了一张照片,我会丢失我的位图并收取默认图像。

这是我的代码:

public void takePicture(View view) {

    final CharSequence[] options = { "Take a pic", "Gallery","Cancel" };


    //Build an AlertDialog object
    AlertDialog.Builder builder = new AlertDialog.Builder(Main.this);
    builder.setTitle("Picture");

    //onClickListener method
    builder.setItems(options, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int selected) {
            if(options[selected].equals("Take a pic")){
                //open camera
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
                //this is my global bitmap and I put it null when I push take a picture
                resized=null;
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                startActivityForResult(intent, 1);
            }
            else if(options[selected].equals("Gallery")){
                Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, 2);
            }
            else{
                dialog.dismiss();
            }
            //if user doesn't select anything, show default icon
            //show picture is my layout ImageView and cameraicon is my default icon
            showPicture.setImageResource(R.drawable.cameraicon);
        }
    });
    builder.show();
}

这是我的onActivityResult代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);


    //if my resultCode is RESULT_OK
    if(resultCode == RESULT_OK){
        if(requestCode==1){
            File f = new File(Environment.getExternalStorageDirectory().toString());
            for(File temp: f.listFiles()){
                if(temp.getName().equals("temp.jpg")){
                    f=temp;
                    break;
                }
            }
            try{
                Bitmap bitmap;
                BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
                bitmap = BitmapFactory.decodeFile(f.getAbsolutePath());

                newHeight=600;
                newWidth=900;
                //resized is my global bitmap
                resized = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);

                //show my new bitmap in my ImageView
                showPicture.setImageBitmap(resized);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //I choose gallery option
        else if(requestCode==2){
            Uri selectedImage = data.getData();
            String[] filePath = {MediaStore.Images.Media.DATA};
            Cursor c = getContentResolver().query(selectedImage,filePath,null,null,null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePath[0]);
            String picturePath = c.getString(columnIndex);
            c.close();
            Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));

            newHeight=600;
            newWidth=900;
            //my global bitmap
            resized = Bitmap.createScaledBitmap(thumbnail, newHeight, newWidth, true);
            //show new bitmap in my ImageView
            showPicture.setImageBitmap(resized);
        }
    }
}

当我打开手机时,我松开了我的位图。我能做什么,拜托? 非常感谢!!

3 个答案:

答案 0 :(得分:0)

我认为您通过调用onSaveInstaceState(Bundle bundle)来保存位图的值,然后在重新创建活动时将其恢复。

答案 1 :(得分:0)

您可能希望将文件名存储到活动内的照片文件中:

class MyActivity {
    File imageFile = null;
}

由于您的活动在轮播时会被销毁,因此您需要将该图片文件名保存在onSaveInstanceState()中:

public void onSaveInstanceState(Bundle outState)
{
    if (imageFile != null) {          
          outState.putString("IMAGE_FILENAME", imageFile.getAbsolutePath());
    }
}

android中的位图是Parcelable,因此您可以保存Bitmap本身,而不是存储图像的文件名。

重新创建活动时,已保存的状态将传递到onCreate()

public void onCreate(Bundle savedState)
{
    super.onCreate(savedState);
    if (savedState != null) {
         String imagePath = saveState.getString("IMAGE_FILENAME");
         if (imagePath != null) {
             imageFile = new File(imagePath);
         }
    }
    updateImageView();
} 

public void updateImageView()
{
    // code from onActivityResult() to load the image
}

附注:

File f = new File(Environment.getExternalStorageDirectory().toString());
for (File temp: f.listFiles()) {
    if (temp.getName().equals("temp.jpg")) {
        f = temp;
        break;
    }
}

您正在写入全局外部存储目录。请不要这样做,请使用您的应用程序文件'目录。此外,无需在路径中搜索固定文件名,只需检查文件是否存在。

File imageFile = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), imageFileName);
if (imageFile.exists()) {
   [...]
}

答案 2 :(得分:0)

我认为更好的方法是使用片段代替活动。 当您转动设备时,使用方法fragment.setRetainInstance(true),片段不会被销毁。