You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:12