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

如何在Kotlin中创建共享元素过渡监听器以延迟UI更新?

在Kotlin中延迟UI操作至共享元素过渡完成

嘿,我懂你遇到的麻烦——Java转过来的写法在Kotlin里总显得生硬,还要处理一堆接口方法的空实现。下面给你一套纯Kotlin风格的解决方案,完美适配你的需求:

基础实现:直接监听过渡结束

在目标Activity(也就是ActivityB)的onCreate方法里,你可以这样监听共享元素过渡的结束事件,然后执行延迟的UI更新:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_b)

    // 获取共享元素进入过渡实例
    val sharedEnterTransition = window.sharedElementEnterTransition

    sharedEnterTransition?.addListener(object : Transition.TransitionListener {
        // 过渡开始时的回调(可选实现)
        override fun onTransitionStart(transition: Transition) {}

        // 核心逻辑:过渡完成后执行UI更新
        override fun onTransitionEnd(transition: Transition) {
            // 这里写你要延迟执行的UI操作
            updateUIAfterTransition()
            // 务必移除监听器,避免内存泄漏
            transition.removeListener(this)
        }

        // 过渡取消时也要清理监听器
        override fun onTransitionCancel(transition: Transition) {
            transition.removeListener(this)
        }

        // 以下两个方法留空即可,不需要额外逻辑
        override fun onTransitionPause(transition: Transition) {}
        override fun onTransitionResume(transition: Transition) {}
    })
}

private fun updateUIAfterTransition() {
    // 示例:更新文本、显示隐藏控件、加载数据等
    yourTextView.text = "共享元素过渡完成!"
    yourHiddenImageView.visibility = View.VISIBLE
}

进阶优化:用Kotlin扩展简化代码

如果不想每次都写一堆空实现的方法,可以封装一个扩展函数,让代码更清爽:

// 在任意顶层文件中定义这个扩展函数,全局可用
fun Transition.doOnEnd(action: () -> Unit) {
    addListener(object : Transition.TransitionListener {
        override fun onTransitionStart(transition: Transition) {}
        override fun onTransitionEnd(transition: Transition) {
            action()
            transition.removeListener(this)
        }
        override fun onTransitionCancel(transition: Transition) {
            transition.removeListener(this)
        }
        override fun onTransitionPause(transition: Transition) {}
        override fun onTransitionResume(transition: Transition) {}
    })
}

之后在Activity里就能像这样简洁调用:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_b)

    window.sharedElementEnterTransition?.doOnEnd {
        updateUIAfterTransition()
    }
}

关键注意点

  • 内存泄漏防护:一定要在过渡结束或取消时移除监听器,否则Transition可能持有Activity的引用,导致内存泄漏。
  • 空安全处理:用?.操作符处理sharedElementEnterTransition可能为空的情况,避免空指针异常。

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:03