微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何保留多个活动之间的共享元素转换 - 在 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 举报,一经查实,本站将立刻删除。