Android 如何保留多个活动之间的共享元素转换-在API30中被破坏?
我有三个活动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一起使用时,一切正常 开始我正在使用的活动时: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一起使用时,一切正常 开始我正在使用的活动时
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列表中