如何解决如何保留多个活动之间的共享元素转换 - 在 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 -> A 在去了 B -> C -> B 之后是不同的?更新 - 这仅在 API30 下发生(使用 Nexus 9 仿真)。当我使用带有 API28 的 Nexus 9 时,一切都按预期工作!
开始我正在使用的活动时:
val options = ActivityOptions.makeSceneTransitionAnimation(this,transition_name)
startActivity(intent,options.toBundle())
我有一个理论,问题发生在 B 中,当调用 C 时,它正在更改 B 的 enterTransition、sharedElementEnterTranstion、exitTransition、sharedElementExitTranstion、returnTransition、sharedElementReturnTranstion、reenterTransition、sharedElementReenterTranstion 属性,因此不会转换回 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>
第二个屏幕 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=".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>
第三屏 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=".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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。