首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回calledActivity时,共享元素转换在Android10(Q)中不起作用

返回calledActivity时,共享元素转换在Android10(Q)中不起作用
EN

Stack Overflow用户
提问于 2019-12-10 14:44:09
回答 2查看 562关注 0票数 4

仅在android-10(Q)中获得此功能,并且在android派和api级别以下运行良好。我正在尝试使用sharedElement转换。从recyclerView项目到新活动。当我使用两个活动,即从活动A ->活动B和从活动B返回->活动A时,它工作得很好,而使用三个活动A,B和C时,它工作得很好。

Activity A通过sharedElement转换-> Activity B,Activity B -> Activity C,不带任何转换。在此活动C之后,->活动B ->活动A。

从活动B ->活动A开始的SharedElement转换不起作用。

EN

回答 2

Stack Overflow用户

发布于 2020-03-03 20:10:05

您可以尝试在ActivityB的onStop方法中添加这些代码

代码语言:javascript
复制
override fun onStop() {
    if (!isFinishing && Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {    
        Instrumentation().callActivityOnSaveInstanceState(this, Bundle())
    }
    super.onStop()
}

我使用这个方法来避免这个问题。

票数 3
EN

Stack Overflow用户

发布于 2020-07-10 20:51:36

我实际上遇到了同样的问题,就像Android 10+上的OP (11dev预览版也受到了影响)。我花了大约两周的时间,所以我会试着总结一下我的发现,以及我是如何在我的项目中修复它的。

所以我发现,如果调用ppxpp发布的代码作为应答,当屏幕旋转(或任何其他配置更改)时,它确实会有所帮助。

然后,我发现最好将所有共享元素名称保存到onSaveInstanceState()中的字符串数组中,如下所示:

代码语言:javascript
复制
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        sharedElementList?.run {
            outState.putStringArrayList(PENDING_EXIT_SHARED_ELEMENTS, ArrayList(this))
        }
    }
}

其中const val PENDING_EXIT_SHARED_ELEMENTS = "android:pendingExitSharedElements"是在ActivityTransitionState中定义的常量

要获得sharedElementList,您可以在onCreate()中调用此函数。

代码语言:javascript
复制
setEnterSharedElementCallback(object : SharedElementCallback() {
        override fun onSharedElementsArrived(sharedElementNames: MutableList<String>?, sharedElements: MutableList<View>?, listener: OnSharedElementsReadyListener?) {
            super.onSharedElementsArrived(sharedElementNames, sharedElements, listener)
            sharedElementList = sharedElementNames?.toList()
        }

}

接下来,活动实际上需要重新创建才能生效-所以只有在旋转活动B上的屏幕时,添加此操作才能使其工作。

因此,我在活动B上调用recreate(),比如在我打开活动C之后500-1000ms,这样转换就不会太慢。

请谨慎调用supportPostponeEnterTransition()startPostponedEnterTransition(),因为如果它们在进入活动B时调用它们,则在recreate()之后将再次调用它们

一般来说,调用recreate一次就足够了,所以我自己在活动B中保留了一个本地标志,让我知道活动是否已经重新创建,这样每次从B到C再返回时,我就不会做太多不必要的事情。

总体而言,这只是一个高级的解决方案,我正在处理更多的问题,在每个活动中都有回收视图,这使得事情变得更加复杂。

如果你找到更好的建议,请评论,我很想听,但我不能再花更多的时间在这上面了,因为两周的安卓源代码调查和比较API28和29对我来说已经足够了:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59261601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档