仅在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转换不起作用。
发布于 2020-03-03 20:10:05
您可以尝试在ActivityB的onStop方法中添加这些代码
override fun onStop() {
if (!isFinishing && Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
Instrumentation().callActivityOnSaveInstanceState(this, Bundle())
}
super.onStop()
}我使用这个方法来避免这个问题。
发布于 2020-07-10 20:51:36
我实际上遇到了同样的问题,就像Android 10+上的OP (11dev预览版也受到了影响)。我花了大约两周的时间,所以我会试着总结一下我的发现,以及我是如何在我的项目中修复它的。
所以我发现,如果调用ppxpp发布的代码作为应答,当屏幕旋转(或任何其他配置更改)时,它确实会有所帮助。
然后,我发现最好将所有共享元素名称保存到onSaveInstanceState()中的字符串数组中,如下所示:
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()中调用此函数。
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对我来说已经足够了:
https://stackoverflow.com/questions/59261601
复制相似问题