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)
我没有测试过这个,所以我不知道它是否有效。希望是这样。
\n\n但你应该意识到这一点
\n\n\n\n\n...您可能无法使用系统通过 onSaveInstanceState() 回调为您保存的 Bundle 来完全恢复\n 活动状态\xe2\x80\x94它不适合携带大型\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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1472 次 |
| 最近记录: |