Android 如何保留多个活动之间的共享元素转换-在API30中被破坏?

Android 如何保留多个活动之间的共享元素转换-在API30中被破坏?,android,android-activity,android-transitions,android-api-levels,Android,Android Activity,Android Transitions,Android Api Levels,我有三个活动A、B和C,使用A和B之间以及B和C之间的共享元素转换 A->B工作正常,然后使用后退按钮或finishAfterTransition平滑地将B转换回A B->C也很好,从C返回到B也很顺利 但是A->B->C->B->A是问题所在。C->B转换是平滑的,但是B返回到A转换被“遗忘”,只是没有平滑转换的瞬间跳跃 为什么在B->C->B之后B->A会有所不同?更新-这仅在API30下发生(使用Nexus9仿真)。当我将Nexus9与API28一起使用时,一切正常 开始我正在使用的活动时

我有三个活动A、B和C,使用A和B之间以及B和C之间的共享元素转换

A->B工作正常,然后使用后退按钮或finishAfterTransition平滑地将B转换回A

B->C也很好,从C返回到B也很顺利

但是A->B->C->B->A是问题所在。C->B转换是平滑的,但是B返回到A转换被“遗忘”,只是没有平滑转换的瞬间跳跃

为什么在B->C->B之后B->A会有所不同?更新-这仅在API30下发生(使用Nexus9仿真)。当我将Nexus9与API28一起使用时,一切正常

开始我正在使用的活动时:

val options = ActivityOptions.makeSceneTransitionAnimation(this, transition_name)
startActivity(intent, options.toBundle())
我有一个理论认为问题发生在B中,当调用C时,它正在更改B的enterTransition、ShareDelementEnterTransition、exitTransition、ShareDelementExitTransition、returnTransition、ShareDelementReturnTransition、ReinterTransition、ShareDelementReinterTransition属性,因此不会转换回A。但是,我保存并记录了所有这些内容,并且在这两种情况下,对象的详细信息似乎没有什么不同

感谢您的帮助

我在一个非常简单的三个活动项目中模拟了这个问题:

第一屏XML:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/testtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:onClick="secondActivity"
        android:text="Go to second screen"
        android:transitionName="transition_name"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/testtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Welcome to the second activity"
        android:transitionName="transition_name"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.147" />

    <TextView
        android:id="@+id/testtext2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:onClick="thirdActivity"
        android:text="Go to third screen"
        android:transitionName="transition_name2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.996"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.466" />

</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ThirdActivity">

    <TextView
        android:id="@+id/testtext2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:transitionName="transition_name2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.845" />

</androidx.constraintlayout.widget.ConstraintLayout>
第二项活动:

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Pair
import android.view.View

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun secondActivity(view: View) {

        val intent = Intent(this, SecondActivity::class.java)

        val view: View = findViewById(R.id.testtext)
        val pair = Pair.create(view, "transition_name")

        val options = ActivityOptions.makeSceneTransitionAnimation(this, pair)
        startActivity(intent, options.toBundle())
    }
}
import android.app.ActivityOptions
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.transition.Fade
import android.transition.Transition
import android.util.Log
import android.util.Pair
import android.view.View

class SecondActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    }

    fun thirdActivity(view: View) {

            val intent = Intent(this, ThirdActivity::class.java)
            val view: View = findViewById(R.id.testtext2)
            val pair = Pair.create(view, "transition_name2")
            val options = ActivityOptions.makeSceneTransitionAnimation(this, pair)

            startActivity(intent, options.toBundle())
    }

    override fun onBackPressed() {
        super.onBackPressed()
        supportFinishAfterTransition()
    }
}
import android.os.Bundle

class ThirdActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_third)
    }

}
第三项活动:

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Pair
import android.view.View

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun secondActivity(view: View) {

        val intent = Intent(this, SecondActivity::class.java)

        val view: View = findViewById(R.id.testtext)
        val pair = Pair.create(view, "transition_name")

        val options = ActivityOptions.makeSceneTransitionAnimation(this, pair)
        startActivity(intent, options.toBundle())
    }
}
import android.app.ActivityOptions
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.transition.Fade
import android.transition.Transition
import android.util.Log
import android.util.Pair
import android.view.View

class SecondActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    }

    fun thirdActivity(view: View) {

            val intent = Intent(this, ThirdActivity::class.java)
            val view: View = findViewById(R.id.testtext2)
            val pair = Pair.create(view, "transition_name2")
            val options = ActivityOptions.makeSceneTransitionAnimation(this, pair)

            startActivity(intent, options.toBundle())
    }

    override fun onBackPressed() {
        super.onBackPressed()
        supportFinishAfterTransition()
    }
}
import android.os.Bundle

class ThirdActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_third)
    }

}

发现这是的副本,并且也记录在Android bugs列表中