从onActivityResult调用共享元素过渡的startActivity

时间:2019-05-22 20:32:28

标签: android android-animation onactivityresult

我正在onActivityResult中打电话

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

我期望发生的事情
activityB 将通过共享元素转换启动并显示

实际发生的情况
activityB 不会启动/显示,直到将应用程序最小化并从最新版本重新打开为止(此时动画也不会显示)。无需添加场景过渡,它可以正常工作,并且可以在代码中的任何其他地方调用它,如预期的那样。

我已经尝试过

  • runOnUiThread。
  • postponeEnterTransition()startPostponedEnterTransition()在第二活动中。
  • finishAfterTransition()导致闪烁,然后显示 activityB ,我不想完成 activityA ,而只是尝试了一下。
  • 取而代之的是使用onActivityReenter(),因为我startActivityForResult()使用Google登录时似乎没有被调用。

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

2 个答案:

答案 0 :(得分:1)

对于现代版本的Android API,在onActivityResult()onStart()之间调用

onResume()。听起来好像在恢复活动之前用共享元素转换开始新的活动 时出现问题。

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

要变通解决此问题,建议将信息保存在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
    }
}

答案 1 :(得分:0)

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

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

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