共享元素转换中的IllegalArgumentException

cgr*_*cgr 5 animation android android-activity shared-element-transition

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

报告:

Fatal Exception: java.lang.IllegalArgumentException
       at android.os.Parcel.readException(Parcel.java:1550)
       at android.os.Parcel.readException(Parcel.java:1499)
       at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:4654)
       at android.app.Activity.isTopOfTask(Activity.java:5557)
       at android.app.Activity.startActivityForResult(Activity.java:3903)
       at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:65)
       at android.app.Activity.startActivity(Activity.java:4146)
       at com.mypackage.Activity1.method1(Activity1.java:414). 
Run Code Online (Sandbox Code Playgroud)

试过这个:

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); 
Run Code Online (Sandbox Code Playgroud)

那么这个来自ActivityManagerProxy中的 sof IllegalArgumentException:

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);  
Run Code Online (Sandbox Code Playgroud)

两个代码都发生崩溃:

startActivity(intent, options.toBundle());  
Run Code Online (Sandbox Code Playgroud)

曾经面临过?任何提示?

Sha*_*hiM 3

看来你正在使用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> 
Run Code Online (Sandbox Code Playgroud)

来自文档:

Window.FEATURE_CONTENT_TRANSITIONS:

使活动能够通过发送或接收使用或ActivityOptions创建的包来运行活动转换。makeSceneTransitionAnimation(Activity, Pair[])makeSceneTransitionAnimation(Activity, View, String)

Window.FEATURE_ACTIVITY_TRANSITIONS:

请求窗口内容更改的标志应使用TransitionManager.

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

请参阅这篇文章了解更多信息。