使用来自 onActivityResult 的共享元素转换调用 startActivity

Calling startActivity with shared element transition from onActivityResult

我在onActivityResult内调用

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, imgv, imgv.transitionName).toBundle())

我期望发生什么
activityB 以共享元素转换开始和显示

实际发生了什么
activityB 不是 started/displayed 直到最小化应用程序并从最近打开它(此时也不显示动画)。在不添加场景转换的情况下,它可以正常工作,并且从代码中的其他任何地方调用它都可以按预期工作。

我试过了

我怀疑它与动画框架的竞争条件有关

对于 Android API 的现代版本,

onActivityResult()onStart()onResume() 之间被调用。在您的 activity 恢复之前,使用共享元素转换 开始新的 Activity 似乎有问题。

(我不确定为什么会出现这个问题。也许其他用户可以回答。)

要解决此问题,我建议在 onActivityResult() 中保存信息,然后在 onResume() 中查询:

private boolean launchNextActivity = false;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (...) {
        this.launchNextActivity = true;
    }
}

@Override
protected void onResume() {
    super.onResume();

    if (launchNextActivity) {
        launchNextActivity = false;
        // do the launch
    }
}

如果您正在使用 androidx 生命周期,您可以在 onActivityResult 中使用以下代码:

lifecycleScope.launchWhenResumed {
    val bundle = ActivityOptions.makeSceneTransitionAnimation(this@MyActivity, imgv, imgv.transitionName).toBundle()
    startActivity(intent, bundle)
}

这与接受的答案的行为相同。