我正在努力使应用程序更具实质性,而我只是坚持如何实现一些共享元素转换。我有一个活动A,它启动另一个B,然后调用finish()以便从后栈中删除它。在我的情况下,我有一个我想在两个活动之间分享的元素,但是一旦它从A传递到B,A就不再重要了。 如果我在startActivity(ctx,intent,bundle)之后没有调用finish(),则退出/输入动画效果很好。但是,如果我打电话给完成,那么在动画开始之前会有一个非常丑陋的闪烁。
我有什么东西可以忽略,或者是不可能做我想做的事情?
答案 0 :(得分:27)
更新
更好更简单的方式
ActivityCompat. finishAfterTransition(this);
< 3支持库。
答案 1 :(得分:24)
你可以在onStop函数中完成你的活动,如果你只想在从A转换到B时发生这种情况,那么在你调用startActivity(ctx,intent,bundle)之后创建一个标志并设置它:
@Override
public void onStop() {
super.onStop();
if(mShouldFinish)
finish();
}
确保完成活动B后调用finish()而不是finishAfterTranstion(),因为活动A不再存在
完成活动A后,如果按回,B中的共享元素可能会挂起。在ActivityB.onEnterAnimationComplete
中将transitionName设置为null以避免这种情况。
答案 2 :(得分:5)
这可能晚了,但我遇到了同样的问题。 对我有用的是:
supportFinishAfterTransition();
这包含在支持库中,就像魅力一样。
PS:致电finish()
时,您无需致电supportFinishAfterTransition()
。
答案 3 :(得分:2)
在5.0及以上版本中尝试 finishAfterTransition()方法,您可以在退出转换发生后完成活动。
答案 4 :(得分:0)
如果您使用ActivityOptions.makeSceneTransitionAnimation(Activity, android.view.View, String)
进行转换,则应在活动B中使用其回调方法来完成活动A。
setEnterSharedElementCallback(new SharedElementCallback() {
@Override
public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
// finish Activity A
}
});
答案 5 :(得分:0)
我写了this answer的一种变体,因为您不需要字段,所以我觉得它更优雅。
这仍然不是理想的选择,但是它在我的用例中是可行的,它基本上是一个初始屏幕,可以转换到下一个屏幕,我希望立即关闭初始屏幕。
之所以有效,是因为当活动不再可见时调用了onStop
,因此在这一点上,我们实际上可以关闭它而不会造成伪像(在这种情况下,该闪烁/闪烁)
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_STOP) {
lifecycle.removeObserver(this)
finish()
}
}
})