共享元素转换中的IllegalArgumentException

时间:2017-11-02 11:19:15

标签: android animation android-activity shared-element-transition

实施活动共享元素转换的活动。它工作正常,但在极少数运行> = LOLLIPOP的设备上接收崩溃。

报告:

Intent intent = new Intent(Activity1.this, Activity2.class);
     ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(Activity1.this,
                            logoImageView,
                            ViewCompat.getTransitionName(logoImageView));
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                startActivity(intent, options.toBundle());
            } else {
                startActivity(intent);
            }
            overridePendingTransition(R.anim.stay, R.anim.stay); 

尝试了这个:

Intent intent = new Intent(Activity1.this, Activity2.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    ActivityOptions options = ActivityOptions
            .makeSceneTransitionAnimation(Activity1.this,
                    logoImageView,
                    getString(R.string.splashLogoSharedTransition));
    startActivity(intent, options.toBundle());
} else {
    ActivityOptionsCompat options = ActivityOptionsCompat.
            makeSceneTransitionAnimation(SplashActivity.this,
                    logoImageView,
                    getString(R.string.splashLogoSharedTransition));
    ActivityCompat.startActivity(SplashActivity.this, intent, options.toBundle());
}
overridePendingTransition(R.anim.stay, R.anim.stay);  

然后来自此IllegalArgumentException in ActivityManagerProxy

startActivity(intent, options.toBundle());  

以下两个代码都会发生崩溃:

origin

曾经面对过吗?任何提示?

2 个答案:

答案 0 :(得分:2)

好像您正在使用Window.FEATURE_CONTENT_TRANSITIONS。但相反,您应该使用Window.FEATURE_ACTIVITY_TRANSITIONS

styles-v21.xml中,添加:

<item name="android:windowActivityTransitions">true</item>
<!-- optional -->
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item> 

来自文档:

Window.FEATURE_CONTENT_TRANSITIONS

  

允许活动通过发送或接收使用ActivityOptionsmakeSceneTransitionAnimation(Activity, Pair[])创建的makeSceneTransitionAnimation(Activity, View, String)捆绑包来运行活动转换。

Window.FEATURE_ACTIVITY_TRANSITIONS

  

请求窗口内容更改的标记应使用TransitionManager进行动画处理。

     

使用TransitionManager设置setTransitionManager(TransitionManager)。如果未设置,则将使用默认的TransitionManager。

有关详细信息,请参阅this post

答案 1 :(得分:0)

根据这篇文章,你不应该在API 21上面使用ActivityOptionsCompat: https://stackoverflow.com/a/42455484/1067763

我不使用它,但我仍然有这个崩溃:

Crashes after startActivityForResult in API 27

我认为它仍然以某种方式使用了错误的版本。

但是,知道这一点,你或许可以解决你的问题。