如何在按下返回按钮时保存ImageView中上传图片的Uri?
解决Activity销毁后ImageView图片Uri丢失的问题
嘿,这个场景太常见了——当Activity按下返回键销毁后重建,或者遇到屏幕旋转这类配置变更时,之前上传到ImageView的图片Uri很容易丢失,导致图片显示空白。你的代码思路完全正确,就是用Android自带的状态保存机制来解决,我来给你拆解下这个方案,再补充几个关键注意点:
核心实现步骤
Android提供了OnSaveInstanceState和OnRestoreInstanceState(还有OnCreate里的savedInstanceState参数)来帮我们保存临时状态,你的代码已经覆盖了核心流程:
1. 销毁前保存Uri
在Activity即将被系统销毁前,重写OnSaveInstanceState方法,把有效的Uri存入Bundle。因为Uri实现了Parcelable接口,所以直接用PutParcelable就能存:
protected override void OnSaveInstanceState(Bundle outState) { base.OnSaveInstanceState(outState); if (uri != null) { outState.PutParcelable("uri", uri); } }
2. 重建时恢复Uri并显示图片
有两个时机可以恢复状态,选一个或者结合用都可以:
- 在
OnCreate中恢复:Activity重建时,OnCreate会收到保存的savedInstanceState,不为空的话就取出Uri,重新设置给ImageView:protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.User_Account); button.Click += ButtonOnClick; if (savedInstanceState != null) { uri = (Android.Net.Uri)savedInstanceState.GetParcelable("uri"); _imageView.SetImageURI(uri); } } - 在
OnRestoreInstanceState中恢复:这个方法专门用于状态恢复,会在OnStart之后调用,逻辑和上面一致:protected override void OnRestoreInstanceState(Bundle savedInstanceState) { base.OnRestoreInstanceState(savedInstanceState); uri = (Android.Net.Uri)savedInstanceState.GetParcelable("uri"); _imageView.SetImageURI(uri); }
实用提醒
- Uri权限问题:如果你的Uri是从系统媒体库获取的临时权限,有些情况下Activity重建后权限可能失效,导致Uri无法访问。这时候可以考虑把图片复制到App的私有目录,然后保存私有目录的文件路径,这样稳定性更高。
- 空值判断不能少:你代码里的
if (uri != null)很关键,能避免空指针异常,一定要保留。 - 避免重复操作:如果同时在
OnCreate和OnRestoreInstanceState里做恢复,不用担心重复执行——OnRestoreInstanceState只有在有状态需要恢复时才会被调用,系统已经帮我们处理好了。
这个方案是Android官方推荐的临时状态保存方式,完全能解决你遇到的返回键导致Uri丢失的问题。
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

