【问题标题】:IllegalArgumentException in Shared Element Transition共享元素转换中的 IllegalArgumentException
【发布时间】:2017-11-02 11:19:14
【问题描述】:

实现了活动到活动共享元素的转换。它工作正常,但在运行> = 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). 

试过这个:

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); 

那么这个来自IllegalArgumentException in ActivityManagerProxy

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);  

这两个代码都发生了崩溃:

startActivity(intent, options.toBundle());  

遇到过吗?有什么提示吗?

【问题讨论】:

  • 不应该是new Intent(Activity1.this, Activity2.class)吗?
  • @ShahiM 是的,复制错误。已更正。
  • 并且logoImageView 具有属性:android:transitionName="myTransition"
  • 是的,它有。甚至 Activity2 中的图像视图也具有相同的过渡。 v21/styles.xml 也有 true
  • 我看不到代码有任何其他可能的问题。在我的一个项目中,我的代码完全相同。

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


【解决方案1】:

您似乎在使用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:

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

Window.FEATURE_ACTIVITY_TRANSITIONS:

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

TransitionManager 是使用setTransitionManager(TransitionManager) 设置的。如果没有设置,将使用默认的 TransitionManager。

请参阅this post 了解更多信息。

【讨论】:

  • 我的 v21/styles.xml 有 true。这是一个遗留代码,我不确定它添加了什么。如果我在样式中添加 true 以及内容转换标志,可以吗?
  • 是的。绝对的。
  • 酷。感谢您的信息。我会添加它,看看我是否会遇到更多崩溃。我认为我应该关注谷歌文档而不是一篇有点过时并提到 contentTransition 的博客文章。
  • 我会将此修复程序发布到 Play 商店并查看。崩溃并没有发生在我的手机中,而是来自少数用户的手机。我相信它会起作用,我会接受。
  • 我添加了 startActivity(intent, options.toBundle());并且在捕获中,我开始了没有 activityOptions 的活动,所以只调用了 startActivity(intent);。在 catch() 块中添加了一个事件,以了解此答案是否仍会发生崩溃。到目前为止,我收到了 8 个此类事件,这意味着此解决方案无助于修复崩溃。但是我的应用程序并没有因此崩溃,因为我发现了异常。 :)
【解决方案2】:

根据这篇文章,您不应使用 API 21 以上的 ActivityOptionsCompat: https://stackoverflow.com/a/42455484/1067763

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

Crashes after startActivityForResult in API 27

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

不过,知道了这一点,您或许能够解决您的问题。

【讨论】:

  • 我没有根据我的问题使用过。无论如何,正如我在问题中解释的那样,当我使用 ActivityOptions 时,我遇到的崩溃是 LOLLIPOP 及更高版本。
  • 对不起,我没有注意到第二部分是关于同一个帖子。但现在我注意到您同时使用了 ActivityOptions 和 overridePendingTransitions。我想知道这是否是问题的根源?
  • 但我的情况需要 overridePendingTransitions。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多