如何在Android中为动态选择的图像创建savedInstanceState?

ree*_*n29 5 java android drawable android-savedstate

我创建了一个Android应用程序.使用按钮从库中选择图像并在ImageView中检索.图像提取成功.现在我想保存所选Image.It尝试修复的状态.它使崩溃应用程序.当我更改水平方向时,应用程序崩溃.请帮我解决问题.

我的代码:

public class MainActivity extends ActionBarActivity {

ImageView imgBackground;
Button loadImgBtn;

String imgDecodableString;
Drawable drawable;

private static int RESULT_LOAD_IMG = 1;
private static final String IMAGE_DATA = "image_resource";


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

    loadImgBtn = (Button)findViewById(R.id.btnSelectImage);
    imgBackground = (ImageView)findViewById(R.id.myImg);


    loadImgBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /* Create intent to open Image Application like Gallery */
            Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            /* start the Intent */
            startActivityForResult(galleryIntent,RESULT_LOAD_IMG);
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
            /* Get the Image from Data */
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            /* Get the Cursor */
            Cursor cursor = getContentResolver().query(selectedImage,filePathColumn,null,null,null);

            /* Move the first row */
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            imgDecodableString = cursor.getString(columnIndex);
            cursor.close();

            /* Rendering the Image */
            drawable =  new BitmapDrawable(imgDecodableString);
            imgBackground.setBackgroundDrawable(drawable);
        }
    } catch (Exception e) {
        message(getBaseContext()," Error : " + e.getMessage(),Toast.LENGTH_SHORT);
    }
}

public void message(Context ctx,String msg,int duration) {
    Toast.makeText(ctx,msg,duration).show();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
     outState.putParcelable(IMAGE_DATA, (android.os.Parcelable) drawable);
}

@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    drawable = (Drawable) savedInstanceState.getParcelable(IMAGE_DATA);
}
}
Run Code Online (Sandbox Code Playgroud)

Boj*_*man 1

我没有测试过这个,所以我不知道它是否有效。希望是这样。

\n\n

但你应该意识到这一点

\n\n
\n

...您可能无法使用系统通过 onSaveInstanceState() 回调为您保存的 Bundle 来完全恢复\n 活动状态\xe2\x80\x94它不适合携带大型\n 对象(例如位图)并且其中的数据必须先序列化然后反序列化,这会消耗大量内存并使配置更改缓慢。在这种情况下,当您的活动因配置更改而重新启动时,您可以通过保留有状态对象来减轻\n 重新初始化活动的负担。

\n
\n\n
public class MainActivity extends ActionBarActivity {\n\n        ImageView imgBackground;\n        Button loadImgBtn;\n\n        String imgDecodableString;\n        BitmapDrawable drawable;\n\n        private static int RESULT_LOAD_IMG = 1;\n        private static final String IMAGE_DATA = "image_resource";\n\n\n        @Override\n        protected void onCreate(Bundle savedInstanceState) {\n            super.onCreate(savedInstanceState);\n            setContentView(R.layout.activity_main);\n\n            loadImgBtn = (Button)findViewById(R.id.btnSelectImage);\n            imgBackground = (ImageView)findViewById(R.id.myImg);\n\n\n            loadImgBtn.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n            /* Create intent to open Image Application like Gallery */\n                    Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);\n            /* start the Intent */\n                    startActivityForResult(galleryIntent,RESULT_LOAD_IMG);\n                }\n            });\n\n            if(savedInstanceState != null) {\n                Bitmap tmp = savedInstanceState.getParcelable(IMAGE_DATA);\n                if(tmp != null) {\n                    drawable = new BitmapDrawable(getResources(), tmp);\n                    imgBackground.setImageDrawable(drawable);\n                }\n            }\n        }\n\n        @Override\n        protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n            super.onActivityResult(requestCode, resultCode, data);\n            try {\n                if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {\n            /* Get the Image from Data */\n                    Uri selectedImage = data.getData();\n                    String[] filePathColumn = { MediaStore.Images.Media.DATA };\n\n            /* Get the Cursor */\n                    Cursor cursor = getContentResolver().query(selectedImage,filePathColumn,null,null,null);\n\n            /* Move the first row */\n                    cursor.moveToFirst();\n\n                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);\n                    imgDecodableString = cursor.getString(columnIndex);\n                    cursor.close();\n\n            /* Rendering the Image */\n                    drawable =  new BitmapDrawable(imgDecodableString);\n                    imgBackground.setBackgroundDrawable(drawable);\n                }\n            } catch (Exception e) {\n                message(getBaseContext()," Error : " + e.getMessage(), Toast.LENGTH_SHORT);\n            }\n        }\n\n        public void message(Context ctx,String msg,int duration) {\n            Toast.makeText(ctx,msg,duration).show();\n        }\n\n        @Override\n        protected void onSaveInstanceState(Bundle outState) {\n            super.onSaveInstanceState(outState);\n            if(drawable != null && drawable.getBitmap() != null) {\n                outState.putParcelable(IMAGE_DATA, drawable.getBitmap());\n            }\n        }\n\n        @Override\n        protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {\n            super.onRestoreInstanceState(savedInstanceState);\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n