美文网首页知识点
android 三个页面 ActivityOptions 共享元

android 三个页面 ActivityOptions 共享元

作者: couriravant | 来源:发表于2022-03-01 15:57 被阅读0次

android目前只支持两个页面跳转时使用共享元素,如果是三个页面间跳转,中间的页面会丢失共享元素信息,如a -> b >c , c返回b后,此时b的共享元素丢失,造成b返回a时,共享元素返回动画无法执行。

解决:
oncreate保存共享元素:

var sharedElementList: List<String>? = null
  //保存shared element
        setEnterSharedElementCallback(object : SharedElementCallback() {
            override fun onSharedElementsArrived(sharedElementNames: MutableList<String>?, sharedElements: MutableList<View>?, listener: OnSharedElementsReadyListener?) {
                super.onSharedElementsArrived(sharedElementNames, sharedElements, listener)
                sharedElementList = sharedElementNames?.toList()
            }
        })

onResume重建共享元素:

 @SuppressLint("PrivateApi")
    fun updateResume(activity: Activity ){
        try {
            val activityTransitionStateField: Field = Activity::class.java.getDeclaredField("mActivityTransitionState");
            activityTransitionStateField.isAccessible = true
            val mActivityTransitionState = activityTransitionStateField.get(activity)
            val activityTransitionStateClazz =
                Class.forName("android.app.ActivityTransitionState")
            val exitNameField = activityTransitionStateClazz.getDeclaredField("mPendingExitNames")
            exitNameField.isAccessible = true

            exitNameField.set(mActivityTransitionState, sharedElementList)

        } catch (e: Exception) {
            Log.d(Tag, "exception: "+ e.message)
        }
    }

目前没有发现问题,但其实最好用fragment来构建页面b、c来解决该问题,但是实践中b、c用frament后共享元素动画不及预期,同样的transtion,fragment的效果表现像bug一样,最终还是使用了反射方案,线上目前没有收到问题反馈。

相关文章

网友评论

    本文标题:android 三个页面 ActivityOptions 共享元

    本文链接:https://www.haomeiwen.com/subject/aoodrrtx.html