取消共享元素过渡

10
我有两个活动(A和B),当我点击一个按钮时,来自A的元素开始动画过渡到B。然而,我想要在从B返回A时禁用相同的反向过渡播放。
在提出这个问题之前,我在互联网上进行了研究,并发现有两种方法setSharedElementReturnTransition(transition)和setSharedElementReenterTransition(transition)。这些方法在适当的活动onCreate()方法中调用,其参数为transition = null,但这并没有起作用。
我找到的唯一解决方案是,在onBackPressed()中调用finish()而不是super.onBackPressed()来取消过渡。是否还有其他方法实现所需的行为?
总之,当我将后退转换设置为null时,什么也没有改变-过渡未被覆盖。
编辑1. 这是代码:
ActivtyA.java
 public class ActivityA {

    ...
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_A);
            }

    ...

            @Override
            public void onPersonalProfileEditIconClicked() {
                Intent intent = new Intent(ActivityA.this, ActivityB.class);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

                      View sharedView = avatarView;

                      String sharedElementName = getString(R.string.profile_avatar);
                      ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation
                                (ActivityA.this, sharedView, sharedElementName);
                      startActivity(intent, transitionActivityOptions.toBundle());
                } else startActivity(intent);
            }
}  

ActivityB.java

public class ActivityB {

    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_B);
    }

    ...

    @Override
    public void onBackPressed() {
        finish();
    }
}  

在XML文件(activity_A和activity_B)中,sharedView具有属性transitionName。
themes.xml
<resources>
    <style name="theme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:windowActionModeOverlay">true</item>
        <item name="android:windowContentTransitions">true</item>
    </style>
</resources>

1
我也遇到了同样的问题,对于我来说,我在onBackPressed()中使用了finish() - AJay
你试过使用OverridePendingTransition吗? - maatik5
1
请分享你的代码。 - Atman Bhatt
@AJay 谢谢您的回复。我已经尝试过了,但这并不是一个解决方案。 - Milovan Jovic
@AtmanBhatt 我更新了问题。 - Milovan Jovic
2个回答

12

在更新支持库后,可以取消共享元素转换,而无需将super.onBackPressed();更改为finish();

你需要做的只是将(在我的情况下)返回/重新进入转换设置为null,并更改视图上的转换名称。

getWindow().setSharedElementReturnTransition(null); getWindow().setSharedElementReenterTransition(null); view.setTransitionName(null);


我们需要在哪里编写这段代码?在 onBackPressed() 方法内部吗? - Megha Maniar
我认为我最初把它放在onCreate()里面。 - Milovan Jovic
在我的情况下,当转换动画开始并且用户在启动下一个活动之前按下返回按钮时,应用程序会崩溃。有什么解决方法吗? - Megha Maniar

-1
你可以使用以下代码获取所需的输出: ActivityA.java
private void startActivityB(){
    startActivity(new Intent(ActivityA.this, ActivityB.class));
    overridePendingTransition(R.anim.slide_left_to_right, R.anim.slide_right_to_left);
  }

无需编写额外的代码 ActivityB.java

@Override
public void onBackPressed() {
    //TODO
}

或者

如果你想在启动ActivityB后完成ActivityA,那么
ActivityA.java

private void startActivityB(){
      startActivity(new Intent(this, ActivityB.class));
      overridePendingTransition(R.anim.slide_left_to_right, R.anim.slide_right_to_left);
      finish();
} 

ActivityB.java

@Override
public void onBackPressed() {
    startActivity(new Intent(ActivityB.this, ActivityA.class));
    overridePendingTransition(R.anim.slide_right_to_left, R.anim.slide_left_to_right);
    finish();
}

4
overridePendingTransition 不是转场框架的一部分,也与共享元素转场无关,这与提问者的问题无关。 - knezmilos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接