如何在onSaveInstanceState中保存使用Glide和PhotoView的Activity状态?
解决Activity退出/重建时保留Glide+PhotoView状态的方案
步骤1:定义类成员变量保存关键状态
把需要持久化的变量提升为Activity的成员,方便在生命周期方法中访问:
class MainActivity : AppCompatActivity() { // 图片URL定义为成员变量 private val urlJs = "https://fikiwiki.com/uploads/posts/2022-02/1644855597_24-fikiwiki-com-p-kartinki-khd-kachestva-25.jpg" private val urlIs = "https://mobimg.b-cdn.net/v3/fetch/f4/f4e488ef69ea10573c0ce9cfbaf08643.jpeg" // 保存当前显示的图片URL private var currentImageUrl: String? = null // 保存PhotoView的缩放、滚动状态 private var photoViewState: Bundle? = null private lateinit var photoView: PhotoView private lateinit var btJs: View private lateinit var btIs: View
步骤2:在onCreate中初始化并恢复状态
在onCreate里先初始化控件,再从savedInstanceState中恢复之前保存的状态,最后加载对应图片:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化控件 photoView = findViewById(R.id.photo_view) btJs = findViewById(R.id.bt_js) btIs = findViewById(R.id.bt_is) // 恢复之前保存的状态 savedInstanceState?.let { currentImageUrl = it.getString("current_image_url") photoViewState = it.getBundle("photo_view_state") } // 如果有保存的URL,直接加载对应的图片 currentImageUrl?.let { loadImage(it) } // 设置按钮点击事件 btJs.setOnClickListener { currentImageUrl = urlJs loadImage(urlJs) } btIs.setOnClickListener { currentImageUrl = urlIs loadImage(urlIs) } }
步骤3:封装Glide加载图片的方法
把加载逻辑抽成单独方法,同时在图片加载完成后恢复PhotoView的状态:
private fun loadImage(url: String) { Glide.with(this) .load(url) .listener(object : RequestListener<Drawable> { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean ): Boolean { return false } override fun onResourceReady( resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { // 图片加载完成后恢复PhotoView的缩放、滚动位置 photoViewState?.let { photoView.onRestoreInstanceState(it) } // 恢复后清空状态,避免重复恢复 photoViewState = null return false } }) .into(photoView) }
步骤4:重写onSaveInstanceState保存状态
在Activity被销毁前,保存当前显示的图片URL和PhotoView的状态:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 保存当前显示的图片URL currentImageUrl?.let { outState.putString("current_image_url", it) } // 保存PhotoView的缩放、滚动状态 outState.putBundle("photo_view_state", photoView.onSaveInstanceState()) } }
关键说明
- 保存当前图片URL:确保Activity重建后无需用户重新点击按钮,直接加载之前显示的图片。
- 保存PhotoView状态:
photoView.onSaveInstanceState()会返回包含缩放比例、滚动位置的Bundle,加载完成后调用onRestoreInstanceState()即可恢复浏览状态。 - Glide加载监听:必须等图片加载完成后再恢复状态,否则图片尺寸未确定,恢复的位置会出现偏差。
内容的提问来源于stack exchange,提问作者vernellabe
相关产品推荐
相关产品推荐

