使用来自 onActivityResult 的共享元素转换调用 startActivity
Calling startActivity with shared element transition from onActivityResult
我在onActivityResult内调用
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, imgv, imgv.transitionName).toBundle())
我期望发生什么
activityB 以共享元素转换开始和显示
实际发生了什么
activityB 不是 started/displayed 直到最小化应用程序并从最近打开它(此时也不显示动画)。在不添加场景转换的情况下,它可以正常工作,并且从代码中的其他任何地方调用它都可以按预期工作。
我试过了
- runOnUiThread .
postponeEnterTransition()
与
startPostponedEnterTransition()
第二 activity.
finishAfterTransition()
这导致闪烁然后显示activityB,我不想完成activityA 但刚刚试过了。
- 改用
onActivityReenter()
,我无法执行此操作,因为当我 startActivityForResult()
为了使用 google 登录时似乎没有调用它。
我怀疑它与动画框架的竞争条件有关
对于 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)
}
这与接受的答案的行为相同。
我在onActivityResult内调用
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, imgv, imgv.transitionName).toBundle())
我期望发生什么
activityB 以共享元素转换开始和显示
实际发生了什么
activityB 不是 started/displayed 直到最小化应用程序并从最近打开它(此时也不显示动画)。在不添加场景转换的情况下,它可以正常工作,并且从代码中的其他任何地方调用它都可以按预期工作。
我试过了
- runOnUiThread .
postponeEnterTransition()
与startPostponedEnterTransition()
第二 activity.finishAfterTransition()
这导致闪烁然后显示activityB,我不想完成activityA 但刚刚试过了。- 改用
onActivityReenter()
,我无法执行此操作,因为当我startActivityForResult()
为了使用 google 登录时似乎没有调用它。
我怀疑它与动画框架的竞争条件有关
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)
}
这与接受的答案的行为相同。